解析JDK的元Annotation

来源:互联网 发布:windows旧系统文件 编辑:程序博客网 时间:2024/04/27 23:55

一、使用@Retention 

  • 只能修饰一个Annotation定义,用于指定该Annotation可以保留多长时间 

  • 包含一个RetentionPolicy类型的value成员变量 

    • RetentionPolicy.CLASS:编译器把注释记录在class文件中,当运行Java程序时,JVM不在保留注释,默认值 

    • RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中,当运行Java程序时,JVM也会保留注释,程序可以通过反射获取该注释 

    • RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //定义下面的Testable注解保留到运行时   
  2. @Retention(value="RetentionPolicy.RUNTIME")   
  3. public @interface Testable{}   

 

二、使用@Target 

  • 用于修饰一个Annotation定义,指定被修饰的Annotation能用于修饰哪些程序元素 

  • 包含一个名为value的成员变量 

    • ElementType.ANNOTATION_TYPE:只能修饰Annotation 

    • ElementType.CONSTRUCTOR:只能修饰构造器 

    • ElementType.FIELD:只能修饰成员变量 

    • ElementType.LOCAL_VARIABLE:只能修饰局部变量 

    • ElementType.METHOD:只能修饰方法定义 

    • ElementType.PACKAGE:只能修饰包定义 

    • ElementType.PARAMETER:只能修饰参数 

    • ElementType.TYPE:只能修饰类、接口(包括注释型)或枚举定义 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //定义下面的ActionListenerFor注解只能用于成员变量   
  2. @Target(ElementType.FIELD)   
  3. public @interface ActionListenerFor{};   


三、使用@Documented 

  • 用于指定该元Annotation修饰的Annotation类将被javadoc工具提取成文档 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Retention(value="RetentionPolicy.RUNTIME")   
  2. @Target(ElementType.METHOD)   
  3. //定义下面的Testable注解将被javadoc提取   
  4. @Documented   
  5. public @interface Testable{}   

四、使用@Inherited 

  • 指定它修饰的Annotation将具有继承性 

  • 如果某个类使用了A Annotation(定义该Annotation使用了@Inherited修饰)修饰,则其子类将自动具有A注释 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Target (ElementType.TYPE)   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. @Inherited   
  4. public @interface Inheritable {   
  5. }   
  6.    
  7. //使用@Inheritable修饰Base类   
  8. @Inheritable   
  9. class Base{   
  10. }   
  11. //TestInheritable类只是继承了Base类   
  12. //并未直接使用@Inheritable Annotation修饰   
  13. public class InheritableTest extends Base{   
  14.     public static void main(String[] args){   
  15.         System.out.println(InheritableTest.class.isAnnotationPresent(Inheritable.class));   
  16.     }   
  17. }   
0 0
原创粉丝点击