本篇文章讲解的知识点主要围绕注解,废话不多说,只分享Java相关的干货!
meta-annotation
所谓meta-annotation 就是 Annotation 类型的数据,也就是Annotation 类型的Annotation。在定义Annotation 类型时,为 Annotation 类型加上Annotation 并不奇怪,这可以为处理 Annotation 类型的分析工具提供更多的信息。
告知编译器如何处理 annotation @Retention
java.lang.annotation.Retention 类型可以在您定义Annotation 类型时,指示编译器该如何对待自定义的 Annotation类型,编译器默认会将 Annotation 信息留在.class 文件中,但不被虚拟机读取,而仅用于编译器或工具程序运行时提供信息。在使用 Retention 类型时,需要提供 java.lang.annotation.RetentionPolicy 的枚举类型。
RetentionPolicy 的定义如下所示:
RetentionPolicy 为 SOURCE 的例子是@SuppressWarnings,这个信息的作用仅在编译时期告知编译器来抑制警告,所以不必将这个信息存储在.class 文件中。
RetentionPolicy 为 RUNTIME 的时机,可以像是您使用 Java 设计一个程序代码分析工具,您必须让 VM 能读出Annotation 信息,以便在分析程序时使用,搭配反射机制,就可以达到这个目的。
J2SE6.0 的java.lang.reflect.AnnotatedElement 接口中定义有4 个方法:
Class,Constructor,Field,Method,Package 等类,都实现了 AnnotatedElement 接口,所以可以从这些类的实例上,分别取得标示于其上的 Annotation 与相关信息。由于在执行时读取 Annotation 信息,所以定义 Annotation 时必须设置RetentionPolicy 为RUNTIME,也就是可以在 VM 中读取 Annotation 信息。
例:
由于 RetentionPolicy 为 RUNTIME,编译器在处理SomeAnnotation 时,会将Annotation 及给定的相关信息编译至.class 文件中,并设置为 VM 可以读出Annotation 信息。
接下来:
现在假设要设计一个源代码分析工具来分析所设计的类,一些分析时所需的信息已经使用 Annotation 标示于类中了,可以在执行时读取这些 Annotation 的相关信息。
例:
若 Annotation 标示于方法上,就要取得方法的 Method 代表实例,同样的,如果 Annotation 标示于类或包上,就要分别取得类的 Class 代表的实例或是包的 Package 代表的实例。之后可以使用实例上的 getAnnotation()等相关方法,以测试是否可取得 Annotation 或进行其他操作。
限定annotation 使用对象 @Target
在定义 Annotation 类型时,使用 java.lang.annotation.Target 可以定义其适用的时机,在定义时要指定java.lang.annotation.ElementType 的枚举值之一。
举例,假设定义 Annotation 类型时,要限定它只能适用于构造函数与方法成员,则:
将 MethodAnnotation 标示于方法之上,如:
要求为 API 文件的一部分 @Documented
在制作Java Doc 文件时,并不会默认将 Annotation 的数据加入到文件中.Annnotation 用于标示程序代码以便分析工具使用相关信息,有时 Annotation 包括了重要的信息,您也许会想要在用户制作 Java Doc 文件的同时,也一并将 Annotation的信息加入到 API 文件中。所以在定义 Annotation 类型时,可以使用java.lang.annotation.Documented.例
使用 java.lang.annotation.Documented 为定义的Annotation 类型加上Annotation 时,必须同时使用Retention 来指定编译器将信息加入.class 文件,并可以由VM 读取,也就是要设置RetentionPolicy 为RUNTIME。接着可以使用这个Annotation,并产生 Java Doc 文件,这样可以看到文件中包括了@TwoAnnotation 的信息.
子类是否可以继承父类的 annotation @Inherited
在定义 Annotation 类型并使用于程序代码上后,默认父类中的 Annotation 并不会被继承到子类中。可以在定义Annotation 类型时加上java.lang.annotation.Inherited 类型的 Annotation,这让您定义的Annotation 类型在被继承后仍可以保留至子类中。
可以在下面的程序中使用@ThreeAnnotation:
如果有一个类继承了 SomeoneClass 类,则@ThreeAnnotation 也会被继承下来。
以上就是注解相关的知识点,持续更新中,配套视频教程👇,正在学习Java的同学们一定要关注哦~~
Java零基础进阶视频教程
转载:https://blog.csdn.net/bjpowernode_com/article/details/114887227