关于java:Retention和Targer的作用

2次阅读

共计 1085 个字符,预计需要花费 3 分钟才能阅读完成。

注解按生命周期来划分可分为 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:阐明子类能够继承父类中的该注解

正文完
 0