Java 注解(Annotation)

Java 注解(Annotation)
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
内置的注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是

  • @Override - 检查该方法是否是重载方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

  • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。

  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
    作用在其他注解的注解(或者说 元注解)是:

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。

  • @Documented - 标记这些注解是否包含在用户文档中。

  • @Target - 标记这个注解应该是哪种 Java 成员。

  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
    从 Java 7 开始,额外添加了 3 个注解:

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。

  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。

  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

Annotation 架构:

在这里插入图片描述
从中,我们可以看出:

(01) 1 个 Annotation 和 1 个 RetentionPolicy 关联。

可以理解为:每1个Annotation对象,都会有唯一的RetentionPolicy属性。
(02) 1 个 Annotation 和 1~n 个 ElementType 关联。

可以理解为:对于每 1 个 Annotation 对象,可以有若干个 ElementType 属性。

(03) Annotation 有许多实现类,包括:Deprecated, Documented, Inherited, Override 等等。

Annotation 的每一个实现类,都 “和 1 个 RetentionPolicy 关联” 并且 " 和 1~n 个 ElementType 关联"。

下面,我先介绍框架图的左半边(如下图),即 Annotation, RetentionPolicy, ElementType;然后在就 Annotation 的实现类进行举例说明。

在这里插入图片描述

2)java自带的Annotation
通过上面的示例,我们能理解:@interface 用来声明 Annotation,@Documented 用来表示该 Annotation 是否会出现在 javadoc 中, @Target 用来指定 Annotation 的类型,@Retention 用来指定 Annotation 的策略。

理解这一点之后,我们就很容易理解 java 中自带的 Annotation 的实现类,即 Annotation 架构图的右半边。如下图:

在这里插入图片描述

java 常用的 Annotation:

  • @Deprecated – @Deprecated 所标注内容,不再被建议使用。
  • @Override – @Override 只能标注方法,表示该方法覆盖父类中的方法。
  • @Documented – @Documented 所标注内容,可以出现在javadoc中。
  • @Inherited – @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
  • @Retention – @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。
  • @Target – @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。
  • @SuppressWarnings – @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。