注解按生命周期来划分可分为3类:
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 注解;如果要在编译时进行一些预处理操作,比方生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些查看性的操作,比方 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
@Target:注解的作用指标
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——办法
@Target(ElementType.PARAMETER)——办法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
@Retention:注解的保留地位
RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被疏忽,在class字节码文件中不蕴含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会疏忽,运行时无奈取得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其余应用反射机制的代码所读取和应用。
@Document:阐明该注解将被蕴含在javadoc中
@Inherited:阐明子类能够继承父类中的该注解