被 @Target(ElementType.TYPE) 元注解修饰的 Annotation 注解 , 只能在 类 上进行标注 ;
@Annotation( stringValue = "tom", enumValue = Number.ONE, annotationValue = @Annotation2, stringArrayValue = {"tom", "jerry"}) public class Student { }
Target 注解中 , ElementType[] value() 注解属性的类型是数组类型 , 说明可以设置多个 注解 标注 位置 ;
如 : 使用如下
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
元注解修饰 Annotation 注解 , 则可以同时在 类 , 字段 和 方法上使用该 Annotation 注解 ;
四、@Retention 元注解
@Retention 注解用于说明该注解需要保留到什么阶段 ;
Java 代码的三个阶段分别是 : 源代码阶段 , 类对象阶段 , 运行时阶段 ;
查看 Retention 源码 ,
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
Retention 注解的 注解属性 RetentionPolicy value() , 其类型是 RetentionPolicy 枚举类型 , 三个枚举值 , 分别对应 Java 代码三大阶段 源代码阶段 , 类对象阶段 , 运行时阶段 ;
public enum RetentionPolicy { /** * 源代码阶段 * 编译器丢弃该注解. */ SOURCE, /** * 类对象阶段 * 注解会被保存到字节码文件中, 不会被 JVM 读取到. */ CLASS, /** * 运行时阶段 * 注解会被保存到字节码文件中, 并会被 JVM 读取到. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
一般情况下 , 开发则自定义注解 , 都是在运行时进行一些代码分析 , 设置 RetentionPolicy.RUNTIME 注解属性 ;
@Retention(RetentionPolicy.RUNTIME)
五、@Documented 元注解
如果添加了该注解 , 表示当前注解会被抽取到 Java API 文档中 ;
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
使用 javadoc Student.java 命令 , 生成 Java 文档 ; 如果使用 @Documented 注解修饰 Annotation 注解 , 则导出的文档如下 , 在类和方法的上面会显示相应注解 ;
如果不使用 @Documented 注解 , 则生成的文档中没有 Annotation 注解 ;
六、@Documented 元注解
@Inherited : 描述 注解 是否被子类继承 , 如果添加了该注解 , 则子类会自动继承父类的注解 ;
使用 @Inherited 元注解 标注 Annotation 注解 ;
使用 Annotation 注解 标注父类 Person ;
子类 Student 继承 Person 类 , 子类中不添加注解 , 那么父类 Person 中的注解自动添加给子类 Student ;