元注解
@Target:这个注解的取值是一个 ElementType 类型的数组,用来指定注解所使用的对象范围,总共有十种不同的类型,根据定义的注解进行灵活的组合,如下所示:
元素类型 | 适用于 |
---|---|
ANNOTATION_TYPE | 注解类型声明 |
CONSTRUCTOR | 构造函数 |
FIELD | 实例变量 |
LOCAL_VARIABLE | 局部变量 |
METHOD | 方法 |
PACKAGE | 包 |
PARAMETER | 方法参数或者构造方法参数 |
TYPE | 类(包括ENUM)和接口(包含注解类型) |
TYPE_PARAMETER | 类型参数 |
TYPE_USE | 类型的用途 |
同时支持多种类型的注解定义如下:
1 | @Target({ElementType.TYPE,ElementType.PACKAGE}) |
@Retention:用来指明注解的访问范围,也就是在什么级别下保留注解,主要有下面三种类型:
- 源码级注解(SOURCE):在定义注解接口时,使用@Retention(RetentionPolicy.SOURCE)修饰的注解,该类型的注解信息只保留在 .java 源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的 .class 文件中。
- 编译时注解(CLASS):在定义注解接口时,使用@Retention(RetentionPolicy.CLASS)修饰的注解,该类型的注解信息只保留在 .java 源码里和 .class 文件里,在执行的时候会被Java 虚拟机丢弃,不会加载到虚拟机里。
- 运行时注解(RUNTIME):在定义注解接口时,使用@Retention(RetentionPolicy.CLASS)修饰的注解,Java 虚拟机在运行期间也保留注解信息,也可以通过反射机制读取注解的信息。( .java 源码、.class 文件和执行的时候都有注解的信息 )
@Documented:表示被修饰的注解应该被包含在被注解项的文档中(例如用JavaDoc生成的文档)。
@Inherited:表示该注解可以被子类继承的。
@Repeatable:表示这个注解可以在同一个项上面应用多次,不过这个注解是 Java8 中才引入的,前面的4个注解都是在 Java 5 中引入的。