Skip to content

注解

注解(Annotation)是从 JDK5.0 开始引入的,以 @注解名 在代码中存在。

注解 可以像修饰符一样被使用,可以用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 name = value 键值对中。

常用注解

注解描述
@Override让编译器检查该方法是否正确地实现了覆写,该注解只能用于方法
@Deprecated用于表示修饰的元素(类、方法)已过时
@SuppressWarnings告诉编译器忽略此处代码产生的警告
@SuppressWarnings 指定要忽略的警告类型(了解)
类型描述
all抑制所有警告
unchecked抑制与未检查的作业相关的警告
unused抑制定义了但是未使用的变量
deprecation抑制与淘汰的相关警告
null抑制与空值分析相关的警告
rawtypes抑制与使用 raw 类型相关的警告
static-access抑制与静态存取不正确相关的警告
static-method抑制与可能宣告为 static 的方法相关的警告
super抑制与置换方法相关但不含 super 呼叫的警告
java
class Person {
  private String name;
  private int age;

  @Deprecated
  public Person(String name, int age) {
    this.age = age;
    this.name = name;
  }

  public void eat() {
    System.out.println("人吃饭...");
  }
}

class Student extends Person {
  @Override
  public void eat() {
    System.out.println("学生吃饭...");
  }
}
java
public static void main(String[] args) {
  Person p3 = new Person("王一博", 20); //报警告,表示构造函数已过时

  @SuppressWarnings("unused") int num = 10; //抑制警告,默认会报变量未使用的警告
}

元注解

有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。

类型描述
@Target用于描述注解的使用范围,如某注解只能用于类/接口,或者只能用于方法
@Retention用于描述注解的生命周期,有 SOURCE、CLASS(默认)、RUNTIME 三种,只有 RUNTIME 阶段可以被反射读取到
@Repeatable可以定义注解是否可以重复,了解
@Documented被标注的方法在生成 doc 文档时会出现,了解
@Inherited允许子类继承父类的注解,仅针对@Target(ElementType.TYPE)类型的注解有效,了解

使用 @Deprecated 已过时注解作为示例:

java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
  String since() default "";

  boolean forRemoval() default false;
}

自定义注解

一个完整的注解应该包含三个部分:声明、使用、读取。

java
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
@Retention(RUNTIME)
public @interface MyAnnotation {
  int type() default 0;
  String value() default "hello"; //使用default关键字指定value默认值
}
java
@MyAnnotation(value = "class")
class Person {
  private String name;
  private int age;

  @MyAnnotation()
  public Person() {
  }
}

TIP

  1. 自定义注解可以通过 4 个元注解分别说明 生命周期、使用位置、是否被继承、是否被生成到 doc API文档中;
  2. 注解 以无参数有返回值的抽象方法的形式来声明,我们又成为配置参数。返回值类型只能是八种基本数据类型、String类型、Class类型、Enum类型、注解类型、以上所有类型的数组
  3. 可以使用 default 关键字为抽象方法指定默认返回值;

Released under the MIT License.