注解有三个可见性:
源码可见(SOURCE)
字节码可见(CLASS)
运行时可见(RUNTIME)
这三个可见性是层层递增的,也就是说运行时可见的注解在前两种状态都是可见的。
下面来验证说明下
三个注解源码:
TestAnnoRetentionSource:
@Retention(RetentionPolicy.SOURCE) @Target(ElementType.FIELD) public @interface TestAnnoRetentionSource { }
TestAnnoRetentionClass:
@Retention(RetentionPolicy.CLASS) @Target(ElementType.FIELD) public @interface TestAnnoRetentionClass { }
TestAnnoRetentionRuntime:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TestAnnoRetentionRuntime { }
测试类如下:
public class AnnotationTest { @TestAnnoRetentionSource public int sourceVisible; @TestAnnoRetentionClass public int classVisible; @TestAnnoRetentionRuntime public int runtimeVisible; public static void main(String[] args) { Class<AnnotationTest> clazz = AnnotationTest.class; for (Field each : clazz.getFields()) { System.out.println(each.getName() + ":"); for (Annotation anno : each.getAnnotations()) { System.out.println("\t" + anno.annotationType().getName()); } System.out.println(); } } }
可以看到三个注解类分别对应三个可见性,并且测试类中三个实例变量也分别用对应的注解修饰。
测试类输入是:
sourceVisible: classVisible: runtimeVisible: 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:在源码、字节码中可见,同时可以在代码中访问
相关推荐
个人收集的相关Java Annotation的资源资料内容。
Java Annotation详解 Java Annotation详解 Java Annotation详解
JDK5.0 - Java Annotation 介绍 (ppt格式)
JAVA Annotation学习示例 的一个简单示例 有源码 也有相关博客说明
Java Annotation注解技术
java annotation 手册.doc,java annotation 手册.doc,java annotation 手册.doc
java之Annotation及其应用
Java Annotation的讲解和例子~~~
Java 5 annotation 学习笔记Java 5 annotation 学习笔记Java 5 annotation 学习笔记
本文针对java初学者或者annotation初次使用者全面地说明了annotation的使用方法、定义方式、分类。初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation...
struts 拦截器,扩展,以及java annotation 这个是我学习所用,放在此处,作为中转。
如果你想知道java annotation是什么?你可以看看
JavaAnnotation必须掌握的特性Java开发Java经验技巧共6页.pdf.zip
Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...
javaAnnotation.pdf
java annotation手册 关于annotation是什么东西,百度一下会有很多关于它的描述,在这里就不用再copy了,我们还是以一个示例开始吧,在开始示例之前,我们先来一个小故事。
Java Annotation入门,本文初步告诉你怎么使用java anotatin
java1.5 annotation注释源代码,