注解

注解是 JDK1.5 版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。

注解基础:

  • 生存文档,通过代码里标识的元数据生成 javadoc 文档
  • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
  • 编译时动态处理,编译时通过代码里标识的元数据动态处理
  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。

注解常用分类:

  • Java 自带的标准注解,包括@Override@Deprecated@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
  • 元注解,元注解是用于定义注解的注解,包括@Retention@Target@Inherited@Documented@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成 javadoc 文档。
  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解

Java 内置注解

从最为常见的 Java 内置的注解开始说起。

TIP

在使用 Annotation 时要在其前面添加@符号,并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素

@Override

  • 限定某方法,是重写父类方法,该注解只能用于方法

  • 如果没有写@Override还是重写了父类的方法,编译器一样能判断是否进行了重写

WARNING

语法校验:
如果写了@Override 注解,编译器就会其检查该方法是否真的重写了父类的方法。如果的确重写了,则编译通过,如果没有构成重写,则编译错误

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {

解读:

  • @interface表示一个注解类
  • @Target(ElementType.METHOD),说明只能修饰方法,即元素的类型为方法

TIP

@Target 是修饰注解的注解称为元注解

@Deprecated

  • 用于表示某个程序元素(类,方法,字段,包,参数等)已过时
  • 不推荐使用,但是仍然可以使用
  • @Deprecated 一般做版本升级过度使用
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

从它的定义我们可以知道,它会被文档化,能够保留到运行时,能够修饰构造方法、属性、局部变量、方法、包、参数、类型。这个注解的作用是告诉编译器被修饰的程序元素已被“废弃”,不再建议用户使用。

解读:

  • CONSTRUCTOR 构造器,FIELD 字段(属性),LOCAL_VARIABLE (局部变量),METHOD 方法,PACKAGE 包,PARAMETER 参数,TYPE 类型

@Suppresswarnings

  • 当不希望看到警告时,可以使用 Suppresswarnings 注解来抑制编译器警告
  • 在{""}中,写入希望抑制的信息
    • unchecked 忽略没有检查的警告
    • rawtypes 忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
    • unused 忽略没有使用某个变量的警告错误
  • 作用范围和放的位置相关,一般放在合适的位置就行了
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

解读:

  • String[] value()是传入的信息数组

JDK 元注解

  • 元 Annotation 用于修饰其他 Annotation
  • 元注解的作用不大,了解它方便读懂源码

种类:

  1. Retention 指定注解的作用范围(指定注解可以保留多长时间),RetentionPolicy 成员变量 value 要指定以下的值
    • SOURCE(编译器使用后,直接丢弃这种策略的注解)
    • CLASS(编译器将把注解记录在 class 文件中,当运行 java 程序时,JVM 不会保留注解。默认值)
    • RUNTIME(编译器将把注解记录在 class 文件中。当运行 Java 程序时,jvm 会保留注解。程序可以通过反射获取该注解)
  2. Target 指定注解可以在哪些地方使用,包含一个 value 变量
  3. Documented 指定该注解是否会在 javadoc 体现,即生成文档时,是否看得到该注解
  4. Inherited 子类会继承父类的该注解