Java Annotation Retention(可见性)

注解有三个可见性:

源码可见(SOURCE)

 

字节码可见(CLASS)

 

运行时可见(RUNTIME)

 

这三个可见性是层层递增的,也就是说运行时可见的注解在前两种状态都是可见的。

下面来验证说明下

 

三个注解源码:

 

TestAnnoRetentionSource:

Java代码 
  1. @Retention(RetentionPolicy.SOURCE)  
  2. @Target(ElementType.FIELD)  
  3. public @interface TestAnnoRetentionSource {  
  4.   
  5. }  

 

 TestAnnoRetentionClass: 

Java代码 
  1. @Retention(RetentionPolicy.CLASS)  
  2. @Target(ElementType.FIELD)  
  3. public @interface TestAnnoRetentionClass {  
  4.   
  5. }  

 

 TestAnnoRetentionRuntime: 

Java代码 
  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target(ElementType.FIELD)  
  3. public @interface TestAnnoRetentionRuntime {  
  4.   
  5. }  

 

测试类如下:

Java代码 
  1. public class AnnotationTest {  
  2.     @TestAnnoRetentionSource  
  3.     public int sourceVisible;  
  4.     @TestAnnoRetentionClass  
  5.     public int classVisible;  
  6.     @TestAnnoRetentionRuntime  
  7.     public int runtimeVisible;  
  8.   
  9.     public static void main(String[] args) {  
  10.         Class<AnnotationTest> clazz = AnnotationTest.class;  
  11.         for (Field each : clazz.getFields()) {  
  12.             System.out.println(each.getName() + ":");  
  13.             for (Annotation anno : each.getAnnotations()) {  
  14.                 System.out.println("\t" + anno.annotationType().getName());  
  15.             }  
  16.             System.out.println();  
  17.         }  
  18.     }  
  19. }  

 

可以看到三个注解类分别对应三个可见性,并且测试类中三个实例变量也分别用对应的注解修饰。

测试类输入是:

 

Java代码 
  1. sourceVisible:  
  2.   
  3. classVisible:  
  4.   
  5. runtimeVisible:  
  6.     cn.teaey.test.annotation.TestAnnoRetentionRuntime  

 

到现在我们能知道,只有课件性为Runtime的注解在我们代码运行的时候能够获取到。

 

再用javap命令查看下测试类的字节码(class)文件

命令:javap -verbose AnnotationTest

输入(部分):

 

1. const #5 = Asciz        sourceVisible;

2. const #7 = Asciz        classVisible;

3. const #8 = Asciz        RuntimeInvisibleAnnotations;

4. const #9 = Asciz        Lcn/teaey/test/annotation/TestAnnoRetentionClass;;

5. const #10 = Asciz       runtimeVisible;

6. const #11 = Asciz       RuntimeVisibleAnnotations;

7. const #12 = Asciz       Lcn/teaey/test/annotation/TestAnnoRetentionRuntime;;

 

第1行能看出,sourceVisible在class字节码中没有任何注解修饰

第2、3、4行可以看出,classVisible变量被一个RuntimeInvisibleAnnotations运行时不可见的注解TestAnnoRetentionClass修饰

第5、6、7行说明,runtimeVisible变量被一个RuntimeVisibleAnnotations运行时可见的注解TestAnnoRetentionRuntime修饰。

 

总结:

SOURCE:只存在于JAVA源码(.java)文件中

CLASS:存在于JAVA源码和字节码(.class)文件中

RUNTIME:在源码、字节码中可见,同时可以在代码中访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值