一)元注解简介
在java.lang.annotation包下,定义了6个元注解。元注解就是修饰注解的注解。
拿到一个注解,如何知道它是否是元注解呢?需要看它的元注解(无论是元注解还是普通注解都是有元注解的),如果看到这样的元注解:@Target(ElementType.ANNOTATION_TYPE),那么此时这个注解一定是元注解。
-
@Retention
-
@Target
-
@Documented
-
@Inherited
-
@Repeatable (java 8新增)
-
类型注解
@Repetable和类型注解暂时不介绍
1.1 @Retention
@Retention用于指定注解可以保留多长时间(生命周期)。
@Retention包含一个名为“value”的成员变量,该value成员变量是RetentionPolicy枚举类型。使用@Retention时,必须为其value指定值。value成员变量的值只能是如下3个:
-
RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器编译时,直接丢弃这种Annotation,不记录在.class文件中。
-
RetentionPolicy.CLASS:编译器把Annotation记录在class文件中。当运行Java程序时,JVM中不可获取该Annotation信息。这是默认值
-
RetentionPolicy.RUNTIME:编译器把Annotation记录在class文件中。当运行Java程序时,JVM可获取该Annotation信息,程序可以通过反射获取该Annotation的信息。
示例:
如果Annotation里有一个名为“value“的成员变量,使用该Annotation时,可以直接使用XXX(val)形式为value成员变量赋值,无须使用name=val形式。
1.2 @Target
@Target指定Annotation用于修饰哪些程序元素。@Target也包含一个名为”value“的成员变量,该value成员变量类型为ElementType[ ],ElementType为枚举类型,值有如下几个:
-
ElementType.TYPE:能修饰类、接口或枚举类型
-
ElementType.FIELD:能修饰成员变量
-
ElementType.METHOD:能修饰方法
-
ElementType.PARAMETER:能修饰参数
-
ElementType.CONSTRUCTOR:能修饰构造器
-
ElementType.LOCAL_VARIABLE:能修饰局部变量
-
ElementType.ANNOTATION_TYPE:能修饰注解
-
ElementType.PACKAGE:能修饰包
示例1(单个ElementType):