@Retention --表示其被修饰的注解保留的时间
1 进入源码:
public @interface Retention {
RetentionPolicy value();
}
可见,其有一个属性value。进入RetentionPolicy:
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
(1)可知value值有三个,SOURCE代表被@Retention修饰的注解只在源码阶段保留,不会被编译。用于做一些检查性的操作,比如 @Override 和 @SuppressWarnings(压制程序中出来的警告)
(2)CLASS代表可以被编译而生成.class文件,但不会被JVM执行,如果一个注解上没有写@Retention
这个注解,则默认为@Retention(RetentionPolicy.CLASS)
,用在当编译时进行一些预处理操作,如生成一些辅助代码。
(3)RUNTIME代表可以被JVM执行,当需要在运行时动态获取注解信息(比如通过反射)时选择此策略。如@Deprecated
,用来表示某个类或属性或方法已经过时,不想别人再用时,前用@Retention (RetentionPolicy.RUNTIME)
修饰。
2 通过源码可以看到,@Retention注解上有一行@Target(ElementType.ANNOTATION_TYPE)
修饰,表明他只可以用来修饰注解。