简单整理了一下Annotation相关的内容。
元Annotation就是修饰Annotation的Annotation。
Java有四个元Annotation:@Retention、 @Target、@Documented和@Inherited。
@Retention
@Retention只能用于修饰一个Annotation定义。用于指定被修饰的Annotation可以保留多长时间。
@Retention包含一个RetentionPolicy类型的alue成员变量,所以使用@Retention时必须为该value成员变量指定值。
value成员变量的值只能是如下3个:
- RetentionPolicy.CLASS:编译器将把Annotation记录在class文件中。当运行Java程序时,JVM不再保留Annotation;
- RetentionPolicy.RUNTIME:编译器将把Annotation记录在class文件中。当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取该Annotation信息;
- RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器直接丢弃这种Annotation。
@Target
@Target也只能修饰一个Annotation定义,它用于指定被修饰的Annotation能用于修饰哪些程序单元。
@Target元Annotation也包含一个名为value的成员变量,该成员变量的值只能是如下几个:
- ElementType.TYPE:指定该策略的Annotation可以修饰类、接口(包括注释类型)或枚举定义;
- ElementType.FIELD:指定该策略的Annotation只能修饰成员变量;
- ElementType.METHOD:指定该策略的Annotation只能修饰方法定义;
- ElementType.PARAMETER:指定该策略的Annotation可以修饰参数;
- ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器;
- ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量;
- ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation;
- ElementType.PACKAGE:指定该策略的Annotation只能修饰包定义。
@Documented
@Documented用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。
如果定义Annotation类时使用了@Documented修饰,则所有使用该Annotation修饰的程序元素的API文档中将会包含该Annotation说明。
@Inherited
@Inherited元Annotation指定被它修饰的Annotation将具有继承性——如果某个类使用了@A Annotation(定义该Annotation使用了Inherited修饰)修饰,则其子类将自动被@A修饰。
参考文档
########
发表评论