第二十三章 注解
定义在 java.lang
包中的5种标准注解:java
@Override
:表示当前的方法定义将覆盖基类的方法。若是你不当心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示。@Deprecated
:若是使用该注解的元素被调用,编译器就会发出警告信息。@SuppressWarnings
:关闭不当的编译器警告信息。@SafeVarargs
:在 Java 7 中加入用于禁止对具备泛型varargs参数的方法或构造函数的调用方发出警告。@FunctionalInterface
:Java 8 中加入用于表示类型声明为函数式接口
基本语法
从语法的角度上看,注解的使用方式和修饰符的使用方式一致。数组
定义注解
@Target
定义你的注解能够应用在哪里(例如是方法仍是字段)。@Retention
定义了注解在哪里可用,在源代码中(SOURCE),class文件(CLASS)中或者是在运行时(RUNTIME)。ide
不包含任何元素的注解称为标记注解(marker annotation)。函数
元注解
Java 语言中目前有 5 种标准注解,以及 5 种元注解。工具
元注解用于注解其余的注解:spa
注解 | 解释 |
---|---|
@Target |
表示注解能够用于哪些地方。可能的ElementType 参数包括:CONSTRUCTOR :构造器的声明FIELD :字段声明(包括 enum 实例)LOCAL_VARIABLE :局部变量声明METHOD :方法声明PACKAGE :包声明PARAMETER :参数声明TYPE :类、接口(包括注解类型)或者 enum 声明 |
@Retention |
表示注解信息保存的时长。可选的RetentionPolicy 参数包括:SOURCE :注解将被编译器丢弃CLASS :注解在 class 文件中可用,可是会被 VM 丢弃。RUNTIME :VM 将在运行期也保留注解,所以能够经过反射机制读取注解的信息。 |
@Documented |
将此注解保存在 Javadoc 中 |
@Interited |
容许子类继承父类的注解 |
@Repeatable |
容许一个注解能够被使用一次或者屡次(Java 8)。 |
编写注解处理器
使用注解中一个很重要的部分就是,建立与使用注解处理器。Java 拓展了反射机制的 API 用于帮助你创造这类工具。同时他还提供了 javac 编译器钩子在编译时使用注解。code
注解元素
注解元素可用的类型以下所示:继承
- 全部基本类型(int、float、boolean等)
- String
- Class
- enum
- Annotation
- 以上类型的数组
默认值限制
元素要么有默认值,要么就在使用注解时提供元素的值。接口
这里有另一个限制:任何非基本类型的元素, 不管是在源代码声明时仍是在注解接口中定义默认值时,都不能使用 null 做为其值。get
生成外部文件
在 @Target
注解中指定的每个 ElementType 就是一个约束,它告诉编译器,这个自定义的注解只能用于指定的类型。你能够指定 enum ElementType
中的一个值,或者以逗号分割的形式指定多个值。若是想要将注解应用于全部的 ElementType,那么能够省去 @Target 注解,可是这并不常见。
快捷方式特性:若是你在注解中定义了名为 value
的元素,而且在使用该注解时,value 为惟一一个须要赋值的元素,你就不须要使用名—值对的语法,你只须要在括号中给出 value 元素的值便可。这能够应用于任何合法类型的元素。这也限制了你必须将元素命名为 value.
替代方案
在 Java 8,在使用多个注解的时候,你能够重复使用同一个注解。