Skip to content

注解

你正站在无上之巅,俯看着优雅的设计模式给你带来的江山......

注解(Annotation)又称标注,是 JDK 1.5 引入的一种注释机制。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。JVM 可以保留标注内容,在运行时可以获取到标注内容。当然它也支持自定义 Java 标注。

当然,注解并不止“提醒”程序员,在 APT(注解处理器)推出后,基于注解配置的应用开发成为了可能。

基本注解

java.lang 中定义了三种注解:

注解名描述
@Override检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings指示编译器去忽略注解中声明的警告。

java.lang.annotation 中定义了五种元注解(作用在其他注解的注解):

注解名描述
@Retention确定注解的的存活时间。可取参数有:
RetentionPolicy.SOURCE(注解只停留在源代码中)、
RetentionPolicy.CLASS(注解保留到字节码文件中)、
RetentionPolicy.RUNTIME (注解在运行时仍可被捕获)
@Documented将注解中的元素包含到 Javadoc 中去
@Target限定注解运用的场景。可取参数有:
ElementType.ANNOTATION_TYPE(可以给一个注解进行注解)、
ElementType.CONSTRUCTOR(可以给构造方法进行注解)、
ElementType.FIELD(可以给属性进行注解)、
ElementType.LOCAL_VARIABLE(可以给局部变量进行注解)、
ElementType.METHOD(可以给方法进行注解)、
ElementType.PACKAGE(可以给一个包进行注解)、
ElementType.PARAMETER(可以给一个方法内的参数进行注解)、
ElementType.TYPE(可以给一个类型进行注解,比如类、接口、枚举)
@Inherited若一个超类被 @Inherited 注解过的注解进行注解的话,且其子类没有被任何注解应用的话,则该子类继承超类的注解。
@RepeatableJava 1.8 新特性! 使一个注解可以在单一实例上被多次调用(而不是覆盖)。详情请阅读外部文章

关于更多信息,请访问 https://zhuanlan.zhihu.com/p/37701743

自定义注解

注解处理器

TIP

阅读本节需要读者了解 AOP 的概念。

注解处理器(APT,Annotation Processor Tools)是 AOP 静态织入的一种原生实现。

遵从 CC BY-NC-SA 4.0