在Java中,元注解(Meta-Annotations)是用于修饰其他注解的注解。Java提供了几个内置的元注解,这些元注解可以定义注解的类型、保留策略、作用域等。以下是Java中常用的元注解:
- @Target:
用于指定被修饰的注解能用于哪些地方。可能的ElementType值有:
ElementType.TYPE
:用于类、接口(包括注解类型)或enum声明ElementType.FIELD
:用于字段(包括enum实例)ElementType.METHOD
:用于方法ElementType.PARAMETER
:用于方法的参数ElementType.CONSTRUCTOR
:用于构造器ElementType.LOCAL_VARIABLE
:用于局部变量ElementType.ANNOTATION_TYPE
:用于注解类型ElementType.PACKAGE
:用于包声明
- @Retention:
用于指定被修饰的注解的保留策略。可能的RetentionPolicy值有:
RetentionPolicy.SOURCE
:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注解RetentionPolicy.CLASS
:在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注解。这是默认值RetentionPolicy.RUNTIME
:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注解。程序可以通过反射获取该注解
- @Documented:
- 用于指定被修饰的注解可以被
javadoc
和类似的工具文档化。默认情况下,javadoc
不记录注解类型,但加上此注解后,javadoc
就会像记录类和方法的注释那样,记录注解。- @Inherited:
- 表示一个注解类型会被自动继承。如果一个类使用了某个被
@Inherited
修饰的注解,则其子类将自动具有该注解类型(前提是没有显式地拒绝这个继承)。注意,此注解仅针对类继承时有效,对接口继承是无效的。- @Repeatable(自Java 8起):
- 用于表示注解可以多次应用于同一声明或类型使用上。要创建可重复的注解,需要将
@Repeatable
注解添加到容器注解中,该容器注解的类型是一个元素的类型为要重复的注解类型的数组。
下面是一个使用元注解的例子:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyDocumentedInheritedAnnotation {
String description() default "";
}
@Repeatable(MyAnnotations.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRepeatableAnnotation {
String value() default "";
}
// 容器注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
MyRepeatableAnnotation[] value();
}
在这个例子中,MyAnnotation
、MyDocumentedInheritedAnnotation
和MyRepeatableAnnotation
都是自定义注解,而它们分别使用了不同的元注解来定义它们的行为。