注解生命周期有3个阶段:源文件,class,字节码
从源程序一直到运行程序这个过程,java将源程序中的注解不断的去除,加上retention这个源注解(描述生命周期)来确定我们的注解在哪里保存
以下是3个状态直接转换时注解的变化:
源文件-->class:
在源程序加上一个注解,源程序通过javac编译成class文件,再编译class文件的时候,可能会将里面的一些注解去掉,这时候我们就拿不到我们想要的注解。
class-->字节码:
注解跟源程序一起被javac编译到class文件中,这时我们用这个class就需要通过类加载器加载到内存中,在这个时候class文件中并不是字节码,加载完以后经过安全处理等其他操作后生成的2进制才是字节码,在这当中可能会把一些注解去掉。
@Retention(RetentionPolicy.SOURCE)保留在源代码阶段(编译器编译是用,源文件-->class阶段)
@Retention(RetentionPolicy.CLASS)默认值,保留在class中(一直保存到生成class文件后)
@Retention(RetentionPolicy.RUNTIME)保留在字节码中(直译保存到运行时) |