Annotaion基础

1、JDK自带的三种annotation

Documented @Retention(value=RUNTIMEpublic @interface Deprecated 

public @interface Override 

public @interface SuppressWarnings

 影响范围:

Deprecated:RUNTIME,可以通过反射机制取出此annotation 

Override:SOURCE只存在于源代码中,编译之后则不存在,无法通过反射获取 
SuppressWarnings:SOURCE只存在于源代码中,编译之后则不存在,无法通过反射获取

 

2、自定义annotation

(1)自定义annotation


  1. import java.lang.annotation.Retention; 
  2. import java.lang.annotation.RetentionPolicy; 
  3.  
  4. @Retention(value=RetentionPolicy.RUNTIME) 
  5. public @interface MyAnnotation { 
  6.     public String val1() default "hello world"
  7.  
  8.     public String val2();//必须赋值 
  9.  
  10.     public int[] val3();//必须赋值 
  11.  
  12.     public String[] val4() default { "zhansan""lisi" }; 
  13.      
  14.     public MyEnum val5() default MyEnum.ZHANGSAN; //annotation的值限定于枚举中的值 
  15. enum MyEnum{ 
  16.     ZHANGSAN, 
  17.     LISI, 
  18.     WANGWU 

(2)使用annotation

 


  1. @Deprecated 
  2. public class Demo02 { 
  3.  
  4.     @Deprecated 
  5.     @SuppressWarnings("unchecked"
  6.     @MyAnnotation(val2 = "", val3 = { 0 }) 
  7.     public String getValue() { 
  8.         return "zhansgan"
  9.     } 
  10.  
  11.     @MyAnnotation(val2 = "lisi", val3 = { 123 }) 
  12.     public int divide(int a, int b) { 
  13.         return a / b; 
  14.     } 

(3)使annotation产生作用

 【注意】只能取得保持策略为RUNTIME的annotation,其他范围的由于不是运行时存在,所以反射的时候无法获取


  1. import java.lang.annotation.Annotation; 
  2. import java.lang.reflect.Method; 
  3.  
  4. public class Demo02Reflect { 
  5.     public static void main(String[] args) throws Exception { 
  6.         Class clazz = Class.forName("com.alibaba.designpattern.anno.Demo02"); 
  7.         Annotation[] annos = clazz.getDeclaredAnnotations(); 
  8.         for (Annotation anno : annos) { 
  9.             System.out.println(clazz.getName() + "类 anno: " + anno); 
  10.         } 
  11.          
  12.         System.out.println("------------------------"); 
  13.          
  14.         Method[] methods = clazz.getMethods(); 
  15.         for(Method method : methods){ 
  16.             Annotation[] methodAnnos = method.getAnnotations(); 
  17.             for(Annotation methodAnno : methodAnnos){ 
  18.                 System.out.println(method.getName() + "方法 anno: " + methodAnno); 
  19.             } 
  20.         } 
  21.     } 

 运行结果:


  1. com.alibaba.designpattern.anno.Demo02类 anno: @java.lang.Deprecated() 
  2. ------------------------ 
  3. getValue方法 anno: @java.lang.Deprecated() 
  4. getValue方法 anno: @com.alibaba.designpattern.anno.MyAnnotation(val4=[zhansan, lisi], val1=hello world, val5=ZHANGSAN, val2=, val3=[0]) 
  5. divide方法 anno: @com.alibaba.designpattern.anno.MyAnnotation(val4=[zhansan, lisi], val1=hello world, val5=ZHANGSAN, val2=lisi, val3=[123]) 

 同时可以通过获取annotation中的参数进行操作。

 

 本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/534694,如需转载请自行联系原作者

上一篇:《Node.js入门经典》一1.6 测验


下一篇:React是什么?(精读React官方文档—01)