- 1. 元注解@Retention
- 2. 元注解@Target
- 3. 自定义注解
@Retention只能用于修饰一个Annotation定义,用于指定被修饰的Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的value成员变量,所以使用@Retention时必须为该value成员变量指定值。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
value成员变量的值只能是如下3个。
- RetentionPolicy.CLASS:编译器将把Annotation记录在class文件中。当运行Java程序时,JVM不再保留Annotation。这是默认值。
- RetentionPolicy.RUNTIME:编译器将把Annotation记录在class文件中。当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取该Annotation信息。
- RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器直接丢弃这种Annotation。
如果需要通过反射获取注释信息,就需要使用value属性值为RUNTIME的@Retention。使用@Retention元数据Annotation可采用如下代码为value指定值。
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyParameter {
}
2. 元注解@Target
@Target也只能修饰一个Annotation定义,它用于指定被修饰的Annotation能用于修饰哪些程序单元。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
@Target元Annotation也包含一个名为value的成员变量,该成员变量的值只能是如下几个:
- ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation。
- ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器。
- ElementType.FIELD:指定该策略的Annotation只能修饰成员变量。
- ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量。
- ElementType.METHOD:指定该策略的Annotation只能修饰方法定义。
- ElementType.PACKAGE:指定该策略的Annotation只能修饰包定义。
- ElementType.PARAMETER:指定该策略的Annotation可以修饰参数。
- ElementType.TYPE:指定该策略的Annotation可以修饰类、接口(包括注释类型)或枚举定义。
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD,ElementType.TYPE})
public @interface MyParameter {
}
3. 自定义注解
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD,ElementType.TYPE})
public @interface MyParameter {
public int id();
public String description() default "描述";
}
id和description类似于方法的定义,description有一个默认值,如果在使用注解时米哟给出description的值,则注解的处理器会使用次元素的默认值。
public class Main {
@MyAnnotation(id=1,description = "haha")
public void show1(){
System.out.println("haha");
}
@MyAnnotation(id=1)
public void show2(){
System.out.println("haha");
}
}
注解的元素在使用时,是名-值的方式。元素要么有默认值,要么在使用时提供元素的默认值,且默认值不能为null。



