目录
一. 问题
啥是注解?
注解是用来干啥的?
Documented 是啥?
Retention 是啥?
Target 是啥?
Inherited 是啥?
ElementType 是啥?
不知道为啥,辛辛苦苦写的表格,突然被机器给吞了 ?
刚开始接触到这玩意的时候,一脸懵逼,我们看java.lang.annotation 包下都有啥,如下所示:
+java
+lang
+annotation
-Annotation
-AnnotationFormatError
-AnnotationTypeMismatchException
-Documented
-ElementType
-IncompleteAnnotationException
-Inherited
-Native
-Repeatable
-Retention
-RetentionPolicy
-Target
二. 说明与解释
哎,有时候中英文机器翻译,堪忧;
2.1 Java 元注解
Java 中使用的元注解有四种:
- @Documented
- @Retention
- @Target
- @Inhertited
2.2 Documented 注解
指示某一类型的注解将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。
简单理解,就是@Documented 注解标注的注解会被javadoc 自动化工具文档收录;
2.3 Retention 注解
指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
只有元注释类型直接用于注释时,Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。
简单理解,就是@Retention 注解标注的注解保留多长,默认保留策略为: RetentionPolicy.CLASS;
@Retention 有如下三种类型保留策略:
序列 | 保留策略 | 描述 | 备注 |
---|---|---|---|
1 | RetentionPolicy.CLASS | 编译器将把注解记录在类文件中,但在运行时 VM 不需要保留注解。 | 默认策略 |
2 | RetentionPolicy.RUNTIME | 编译器将把注解记录在类文件中,在运行时 VM 将保留注解,因此可以反射性地读取。 | |
3 | RetentionPolicy.SOURCE | 编译器要丢弃的注解。 |
只有RetentionPolicy.RUNTIME 时期的注解策略,VM 才能借助于反射动态的读取该注解标识符;
2.4 Target 注解
指示注解类型所适用的程序元素的种类。
如果注解类型声明中不存在 Target 元注解,则声明的类型可以用在任一程序元素上。
如果存在这样的元注解,则编译器强制实施指定的使用限制。
简单理解,就是@Target 注解标注的注释的作用域,有如下几种类型:
序列 | 注解类型 | 描述 | 备注 |
---|---|---|---|
1 | ElementType.ANNOTATION_TYPE | 注解类型声明 | |
2 | ElementType.CONSTRUCTOR | 构造方法声明 | |
3 | ElementType.FIELD | 字段声明(包括枚举常量) | |
4 | ElementType.LOCAL_VARIABLE | 局部变量声明 | |
5 | ElementType.METHOD | 方法声明 | |
6 | ElementType.PACKAGE | 包声明 | |
7 | ElementType.PARAMETER | 参数声明 | |
8 | ElementType.TYPE | 类、接口(包括注释类型)或枚举声明 | |
9 | ElementType.TYPE_PARAMETER | 类型参数声明 | Since 1.8 |
10 | ElementType.TYPE_USE | 类型使用声明 | Since 1.8 |
2.5 Inherited 注解
指示注解类型被自动继承。
如果在注解类型声明中存在 Inherited 元注解,并且用户在某一类声明中查询该注解类型,同时该类声明中没有此类型的注解,则将在该类的超类中自动查询该注解类型。此过程会重复进行,直到找到此类型的注解或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注解,则查询将指示当前类没有这样的注解。
注意: 如果使用注解类型注解类以外的任何事物,此元注解类型都是无效的。还要注意,此元注解仅促成从超类继承注解;对已实现接口的注解无效。
简单理解,就是@Inherted 注解标注的注解可继承父元注解中的注解;
三. 参考
- https://www.oracle.com/cn/java/technologies/java-se-api-doc.html;
- https://docs.oracle.com/javase/8/docs/api/;
- https://tool.oschina.net/apidocs/apidoc?api=jdk-zh;
(完)