从JDK1.5之后,注解在各大框架上得到了广泛的应用。下面这个例子中,你可以判断一个类或者方法或者字段上有没有注解,以及怎么获取上面的注解值。话不多说,代码如下:
AnnotationTest01.java
- package com.zkn.newlearn.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE,ElementType.METHOD,ElementType.PARAMETER})
- public @interface AnnotationTest01 {
- String color();
- }
AnnotationTest02.java
- package com.zkn.newlearn.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- public @interface AnnotationTest02 {
- String getUserName();
- }
AnnotationTest04.java
- package com.zkn.newlearn.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE,ElementType.FIELD})
- public @interface AnnotationTest04 {
- String getAddress();
- }
AnnotationTest03.java
- package com.zkn.newlearn.annotation;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- /**
- * 测试Annotation
- * @author zkn
- *
- */
- @AnnotationTest02(getUserName="zhangsan")
- public class AnnotationTest03 {
- @AnnotationTest01(color="red")
- public static String testColor(String color){
- System.out.println(color);
- return color;
- }
- @AnnotationTest04(getAddress="北京市海淀区")
- String address;
- public static void main(String[] args) {
- //获取方法上的注解值
- Method[] methods = AnnotationTest03.class.getDeclaredMethods();
- if(methods != null){
- for(Method method : methods){
- AnnotationTest01 annotation = method.getAnnotation(AnnotationTest01.class);
- if(annotation == null)
- continue;
- Method[] me = annotation.annotationType().getDeclaredMethods();
- for(Method meth : me){
- try {
- String color = (String) meth.invoke(annotation,null);
- System.out.println(color);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- }
- //获取类上的注解值
- AnnotationTest02 anno = AnnotationTest03.class.getAnnotation(AnnotationTest02.class);
- if(anno != null){
- Method[] met = anno.annotationType().getDeclaredMethods();
- for(Method me : met ){
- if(!me.isAccessible()){
- me.setAccessible(true);
- }
- try {
- System.out.println(me.invoke(anno, null));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- //获取字段上的注解值
- AnnotationTest03 noon = new AnnotationTest03();
- Field[] field = AnnotationTest03.class.getDeclaredFields();
- if(field != null){
- for(Field fie : field){
- if(!fie.isAccessible()){
- fie.setAccessible(true);
- }
- AnnotationTest04 annon = fie.getAnnotation(AnnotationTest04.class);
- Method[] meth = annon.annotationType().getDeclaredMethods();
- for(Method me : meth){
- if(!me.isAccessible()){
- me.setAccessible(true);
- }
- try {
- //给字段重新赋值
- fie.set(noon, me.invoke(annon, null));
- System.out.println(fie.get(noon));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }