元注解
先来份代码样例
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(AnnotationClasss.class)
@Inherited
public @interface AnnotationClass {
public String value() default "annotation";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Inherited
public @interface AnnotationClasss {
AnnotationClass[] value();
}
@Retention
表示这个注解在什么时候存在。其中SOURCE值就是编译时候存在上面这个注解就用到,也用于lombok工作原理;CLASS存在的时间就是在编译之后,以及运行之前Dev这段时间;RUNTIME值表示这个注解会存在jvm里面,即可用反射。
源代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
RetentionPolicy 值如下:
public enum RetentionPolicy {
SOURCE, //在源文件中
CLASS, //在class文件存在
RUNTIME //在jvm运行时候存在
}
@Target
表示这个注解类型适用的上下文,看看枚举类型ElementType的值,以后看注解可以使用在哪些地方,就可以里面的值
public enum ElementType {
TYPE, //字段
FIELD, //字段声明
METHOD, //方法声明
PARAMETER, //参数声明
CONSTRUCTOR, //构造函数声明
LOCAL_VARIABLE, //本地变量声明
ANNOTATION_TYPE, //注解类型声明
PACKAGE, //包声明
TYPE_PARAMETER, //类型参数声明
TYPE_USE; //类型使用
private ElementType() {
}
}
@Documented
注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
@Repeatable
声明这个注解修饰的类型注解是可以重复的。如
@AnnotationClasss({
@AnnotationClass(value = "1122"),
@AnnotationClass(value = "2233")
})
public class Test{
}
@Inherited
表示该注解类型自动继承,比如说AnnotationClass 注解带有@Inherited,类A有注解AnnotationClass ,那么凡是A的子类都会有AnnotationClass 这个注解。