一、定义
写在注解定义上的注解叫元注解(注解是给程序提供信息,写在注解上的注解是给注解提供信息,给信息提供信息的叫元信息)。
二、元注解分类
JDK定义了四种元注解,用来对注解的位置、作用范围、文档抽取、继承进行描述。
1.@Target:
作用:描述定义的注解可以在哪里(包、类、接口、类成员方法、类成员变量、方法参数、局部变量、枚举类型)使用。不写就是表示可以用在所有位置上。
JDK定义了ElementType枚举类型用于描述注解可以出现的位置,ElementType有如下枚举值:
- ElementType.TYPE:能修饰类、接口或枚举类型,但是不能放在属性等其他位置
- ElementType.FIELD:注解仅用于添加到成员变量
- ElementType.METHOD:注解仅用于添加到成员方法
- ElementType.PARAMETER:注解仅用于添加到方法参数
- ElementType.CONSTRUCTOR:注解仅用于添加到构造方法
- ElementType.LOCAL_VARIABLE:注解仅用于添加到局部变量
- ElementType.ANNOTATION_TYPE:注解仅用于添加到注解(元注解)
- ElementType.PACKAGE:注解仅用于添加到包
2.@Retention
作用:描述注解的作用范围,即注解的有效范围。表示生命周期。告诉注解信息保留到哪个阶段,如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
JDK定义了三种有效范围,分别是:注解作用于源代码(编译器可读取注解)、注解作用于类文件(在类文件中可读取注解)、注解作用于运行过程(用反射技术读取注解)。
JDK定义了RetentionPolicy枚举类型用于描述注解作用范围,RetentionPolicy有如下枚举值:
- RetentionPolicy.SOURCE:注解作用于源代码(编译器要丢弃的注解)
- RetentionPolicy.CLASS:注解作用于类文件(编译器将把注解记录在类文件中,但在运行时 JVM 不需要保留注释)
- RetentionPolicy.RUNTIME:注解作用于运行时(编译器将把注解记录在类文件中,在运行时JVM 将保留注解,因此可以反射性地读取)
package anno;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({METHOD,TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {
String ip();
int port() default 3306;
String database();
String encoding();
String loginName();
String password();
}
3.@Documented
作用:表示是否将我们的注解生成在Javadoc中。如果一个注解定义时间使用了该元注解,那么产生的javadoc文档就会把注解显示出来。
4.@Inherited
作用:表示该注解具有继承性。用于子类是可以继承父类中的注解。