【Java】注解(Annotation)
1.1 注解概述
注解是JDK 5.0 开始新增的对元数据(描述数据属性的信息)的支持。可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入一些补充信息。
1.2 三个基本注解
使用 Annotation 时要在其前面增加 @ 符号,并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素。
三个基本的 Annotation:
- @Override:限定重写父类方法,该注解只能用于方法。
- @Deprecated:用于表示所修饰的元素(类, 方法等)已过时,可以使用,但不再建议。
- @SuppressWarnings:抑制编译器警告。
class A {
public void test() {}
}
class B extends A {
@Override // 子类重写父类的方法
public void test() {
super.test();
}
}
1.3 自定义注解
- 定义新的 Annotation 类型使用 @interface 关键字声明。
- 内部定义成员,通常默认使用 value 表示。
- 可以指定成员的默认值,使用 default 定义。
- 如果自定义注解没有成员,表明是一个标识作用。
- 如果注解有成员,在使用注解时,需要指明成员的值。
- 自定义注解必须配上注解的信息处理流程(使用反射)才有意义。
1.4 JDK 中的元注解
1.4.1 四个基本的元注解
JDK 的元 Annotation 用于修饰其他的 Annotation 定义(元注解:对现有的注解进行解释说明的注解)。JDK5.0 提供了 4 个标准的 meta-annotation 类型,分别是:
- Retention
- Target
- Documented
- Inherited
1.4.2 @Retention
@Retention 指定被修饰的 Annotation 的生命周期,@Retention 包含一个 RetentionPolicy 类型的成员变量,使用 @Retention 时必须为该 value 成员变量赋值:
- RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种注释。
- RetentionPolicy.CLASS:在 class 文件中有效(即class文件保留),当运行 Java 程序时,JVM 不会保留这种注解。这是默认值。
- RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java 程序时,JVM 会保留这种注释。只有声明为 RUNTIME 生命周期的注解,才能通过反射获取。
1.4.3 @Target
@Target 指定被修饰的 Annotation 能用于修饰哪些程序元素,@Target 也包含了一个 value 成员变量,他的值只能为:
- METHOD(方法)
- TYPE(类或接口)
- ANNOTATION_TYPE(注解类型)
- CONSTRUCTOR(构造方法)
- FIELD(域)
- LOCAL_VARIABLE(局部变量)
- PACKAGE(包)
- PARAMETER(参数)
自定义注解通常都会指明两个元注解:@Retention、@Target,@Documented 和 @Inherited 出现频率较低。
1.4.4 @Documented
@Documented 指定被修饰的注解类将被 javadoc 工具提取成文档。默认情况下,javadoc 是不包括注解的,只有被 @Documented 修饰后,在 javadoc 解析时才会保留下来。
1.4.5 @Inherited
@Inherited 指定被它修饰的 Annotation 将具有继承性。如果某个类使用了@Xxx,则其子类将自动被@Xxx修饰。