什么是元注解
在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 "";
}