注解@Retention能够用来修饰注解,是注解的注解,称为元注解。
Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
按生命周期来划分可分为3类:
一、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
二、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
三、RetentionPolicy.RUNTIME:注解不只被保存到class文件中,jvm加载class文件以后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
那怎么来选择合适的注解生命周期呢?
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,因此前者能做用的地方后者必定也能做用。
通常若是须要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,好比@Deprecated使用RUNTIME注解
若是要在编译时进行一些预处理操做,好比生成一些辅助代码(如 ButterKnife),就用 CLASS注解;
若是只是作一些检查性的操做,好比 @Override 和 @SuppressWarnings,使用SOURCE 注解。html
注解@Override用在方法上,当咱们想重写一个方法时,在方法上加@Override,当咱们方法的名字出错时,编译器就会报错
注解@Deprecated,用来表示某个类或属性或方法已通过时,不想别人再用时,在属性和方法上用@Deprecated修饰
注解@SuppressWarnings用来压制程序中出来的警告,好比在没有用泛型或是方法已通过时的时候java