多语言展示
当前在线:500今日阅读:23今日分享:31

javaAPI元注解之Retention

首先这个注解是javaAPI四个元注解之一,用于修饰注解,位于java.lang.annotation包下。API源码中的解释:此注解用于指明被修饰注解的保留时间。如果一个新建的注解上没有此注解修饰符,则新建的注解默认的策略是RetentionPolicy.CLASS。Retention元注解,仿佛是在确定被其修饰的注解的声明周期,默认的生命周期是Class。且看下文详细解释。1javaAPI元注解之Inherited
工具/原料
1

annotation

2

Retention

方法/步骤
1

打开Retention的声明,且看其定义的内容。(1)Documented:生成API帮助文档时显示注解。(2)Retention:声明周期是RUNTIME类型。(3)Target:此注解是元注解,只能修饰注解。(4)定义一个value方法,返回值类型是RetentionPolicy。用Retention去修饰某个注解时,会给Retention赋一个RetentionPolicy值,就可以通过这个value获取到。如果不理解,请看:两个小程序重新认识java注解(第五步:“其次获取MyAnnotationForMethod头上的信息”)

2

使用Retention注解时,传入的参数是RetentionPolicy。RetentionPolicy是一个枚举类型,有三个对象。(1)SOURCE:注解被编译器丢弃。比如Override。只会在编译的时候起到检查父类,是否有和子类相同的方法。然后Override就会被编译器丢弃,而不会编译到Class文件中。(2)CLASS:默认的策略,如果一个注解没有被Retention修饰,则就是使用这个策略。相应的CLASS会被编译器编译,且会记录到Class文件中。但是不会被jvm保留,jvm漠视它(猜想:应该是类加载器不会加载Retention=CLASS的注解)。(3)RUNTIME:注解会被编译器记录到Class文件,并且在运行时会被jvm保留,因此他们可以被反射地读取。(reflectively副词,反射地;为此特地查了维基百科)

3

首先创建一个注解类,Retention=SOURCE;再编写测试类和类F。

4

再看一眼Override和Test注解,其Override的Retention=SOURCE,Test的Retention=RUNTIME。

5

运行测试类,查看输出,发现注解就1个,是Test。为什么,因为有两个source,只有Test是runtime,所以jvm只获取到了Test的信息。

6

把注解的Retention改成CLASS,发现还是一个。虽然注解已经编译到class文件中,但是jvm不处理他,也就是注解不会被类装载器装载,所以,我们在运行的过程中,还是找不到这个注解。

7

把注解的Retention改正RUNTIME,发现此时是两个,一个Test注解,一个自定义的MyRetentionAnnotation注解。这也就足以证明了2中的认识。

推荐信息