定义
元注解,顾名思义,就是对注解的注解。
其中@Reteniton注解比较重要,它的作用是:描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到什么时候) 。
一共有三种策略,定义在RetentionPolicy枚举中。
源码:
public enum RetentionPolicy { /**
* Annotations are to be discarded by the compiler.
*/ SOURCE, /**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/ CLASS, /**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/ RUNTIME
}
翻译一下就是:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件时,注解被遗弃;
2、RetentionPolicy.CLASS:注解保留到class文件,但jvm加载class文件时被遗弃,这也是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
使用场景
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
一般如果需要在运行时去动态获取注解信息,那只能用RUNTIME策略;
如果要在编译时进行一些预处理操作,比如生成一些辅助代码,就用CLASS策略;
如果只是做一些检查性的操作,比如@SuppressWarnings,则可选用SOURCE策略。
学完,收工~