引入:
元注解是可以注解到注解上的注解
@Target
@Target 指定了注解运用的地方
@Target 有下面的取值
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Retention
@Retention指定了注解的生命周期
@Retention有下面的取值
RetentionPolicy.SOURCE注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们
@Repeatable
@Repeatable 是可重复的意思,1.8加入的
使用步骤:1.在注解类里面使用@Repeatable注解时要先创建一个数组容器注解类,他们俩的注解(除了@Repeatable注解)要保持一致,而且数组容器注解类需要有一个数组属性,这个属性类型必须是注解类名 2.在@Repeatable里面指向容器的字节码文件
案例:
注解类
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Names.class)
public @interface Name {
String value();
}
数组容器注解类
@Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Names {
Name[] value();
}
测试类
@Name("a")
public class Test {
@Name(value = "aa")
@Names({@Name("a"),@Name("b")})
private String name;
}
@Inherited
@Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
案例:
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {
}
@Test
class A {
}
class B extends A {
}
注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解.
@Documented
顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。