20190928 On Java8 第二十三章 注解
第二十三章 注解
定义在 java.lang
包中的5种标准注解:
@Override
:表示当前的方法定义将覆盖基类的方法。如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示。@Deprecated
:如果使用该注解的元素被调用,编译器就会发出警告信息。@SuppressWarnings
:关闭不当的编译器警告信息。@SafeVarargs
:在 Java 7 中加入用于禁止对具有泛型varargs参数的方法或构造函数的调用方发出警告。@FunctionalInterface
:Java 8 中加入用于表示类型声明为函数式接口
基本语法
从语法的角度上看,注解的使用方式和修饰符的使用方式一致。
定义注解
@Target
定义你的注解可以应用在哪里(例如是方法还是字段)。@Retention
定义了注解在哪里可用,在源代码中(SOURCE),class文件(CLASS)中或者是在运行时(RUNTIME)。
不包含任何元素的注解称为标记注解(marker annotation)。
元注解
Java 语言中目前有 5 种标准注解,以及 5 种元注解。
元注解用于注解其他的注解:
注解 | 解释 |
---|---|
@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 编译器钩子在编译时使用注解。
注解元素
注解元素可用的类型如下所示:
- 所有基本类型(int、float、boolean等)
- String
- Class
- enum
- Annotation
- 以上类型的数组
默认值限制
元素要么有默认值,要么就在使用注解时提供元素的值。
这里有另外一个限制:任何非基本类型的元素, 无论是在源代码声明时还是在注解接口中定义默认值时,都不能使用 null 作为其值。
生成外部文件
在 @Target
注解中指定的每一个 ElementType 就是一个约束,它告诉编译器,这个自定义的注解只能用于指定的类型。你可以指定 enum ElementType
中的一个值,或者以逗号分割的形式指定多个值。如果想要将注解应用于所有的 ElementType,那么可以省去 @Target 注解,但是这并不常见。
快捷方式特性:如果你在注解中定义了名为 value
的元素,并且在使用该注解时,value 为唯一一个需要赋值的元素,你就不需要使用名—值对的语法,你只需要在括号中给出 value 元素的值即可。这可以应用于任何合法类型的元素。这也限制了你必须将元素命名为 value.
替代方案
在 Java 8,在使用多个注解的时候,你可以重复使用同一个注解。