元注解

什么是元注解

在java.lang.annotation包下, 提供了四个用来注解注解的元注解, 用于在自定义注解时使用.

  • @Documented -- 注解是否包含在javaDoc中
  • @Retention -- 什么时候用该注解
  • @Target -- 注解用在什么地方
  • @Inherited -- 是否允许子类继承该注解

@Documented

一个简单的Annotations注解标记, 标识是否将注解加入到Java文档中.

@Retention

定义该注解的生命周期

  • RetentionPolicy.SOURCE 在编译阶段丢弃, 注解在编译之后就不会再有任何意义, 不会写入字节码文件. @Override, @SupperssWarnings都属于该生命周期.
  • RetentionPolicy.CLASS 在类加载的时候丢弃, 在字节码处理过程中有用, 默认使用该生命周期
  • RetentionPolicy.RUNTIME 始终不会丢弃, 运行期也保留该注解, 可以使用反射读取该注解的信息, 自定义注解时常使用该生命周期

@Target

定义该注解用在什么地方, 默认可以用在所有地方

  • ElementType.TYPE -- 用于描述类
  • ElementType.METHOD -- 用于描述方法
  • ElementType.FIELD -- 用于描述成员变量, 对象, 属性(包括enum)
  • ElementType.PACKAGE -- 用于描述包
  • ElementType.CONSTRUCTOR -- 用于描述构造函数
  • ElementType.LOCAL_VARIABLE -- 用于描述局部变量
  • ElementType.PARAMETER -- 用于描述类, 接口(包括注解类型)或enum声明

@Inherited

@Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited 修饰的annotation 类型被用于一个class,则这个annotation 将被用于该class 的子类。

栗子

@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
@Inherited
@interface AnnotationTest{
    String value() default "";
}