Appearance
注解的注解
在 Java 中,注解本身也可以被注解。常见的注解有:
@Target@Retention@Documented@Inherited@Repeatable
1. @Target
@Target 注解用于指定注解可以应用于哪些 Java 元素。它可以用于类、方法、字段、构造函数等不同的代码元素。
- 常见的
ElementType枚举值:ElementType.TYPE: 可以应用于类、接口(包括注解类型)和枚举类型。ElementType.FIELD: 可以应用于字段。ElementType.METHOD: 可以应用于方法。ElementType.PARAMETER: 可以应用于方法的参数。ElementType.CONSTRUCTOR: 可以应用于构造函数。ElementType.LOCAL_VARIABLE: 可以应用于局部变量。ElementType.ANNOTATION_TYPE: 可以应用于注解类型。ElementType.PACKAGE: 可以应用于包。
示例:
javaCopy@Target({ElementType.METHOD, ElementType.FIELD}) // 可以应用于方法和字段
public @interface MyAnnotation {
String value();
}2. @Retention
@Retention 注解用于指定注解的生命周期,即注解的可用时间。它有三个常用的策略:
RetentionPolicy.SOURCE: 注解只在源代码中可见,编译时会被丢弃。RetentionPolicy.CLASS: 注解会被保留到编译后的.class文件中,但在运行时无法访问。RetentionPolicy.RUNTIME: 注解在运行时可用,可以通过反射访问。
示例:
javaCopy@Retention(RetentionPolicy.RUNTIME) // 运行时有效
public @interface MyAnnotation {
String value();
}3. @Documented
@Documented 注解表示被该注解标记的注解会包含在 Javadoc 中。也就是说,如果一个注解上使用了 @Documented,那么使用该注解的类或方法,在生成 Javadoc 时会将注解的元数据包含进去。
示例:
javaCopy@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyDocumentedAnnotation {
String description() default "This is a documented annotation";
}4. @Inherited
@Inherited 注解用于指示一个注解类型是否能够被子类继承。默认情况下,注解不会被子类继承。如果注解标记了 @Inherited,则该注解会被自动继承到子类中。
示例:
javaCopy@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInheritedAnnotation {
String value();
}
@MyInheritedAnnotation(value = "Parent class")
class Parent {}
class Child extends Parent {
// 这里也会继承父类的 @MyInheritedAnnotation 注解
}5. @Repeatable
@Repeatable 注解用于标记一个注解是可重复的,允许一个元素(如类、方法、字段等)上使用多个同类型的注解。为此,目标注解需要使用 @Repeatable 标记,而被重复的注解需要使用 @Target 和 @Retention 进行标注。
- 你需要为重复的注解指定一个容器注解(一个持有多个同类型注解的注解)。
示例:
javaCopy@Repeatable(MyAnnotations.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
MyAnnotation[] value();
}
// 使用多个相同类型的注解
@MyAnnotation(value = "First")
@MyAnnotation(value = "Second")
public class MyClass {}总结:
| 注解 | 作用 |
|---|---|
@Target | 指定注解可以应用于哪些 Java 元素(类、方法、字段等) |
@Retention | 指定注解的保留策略,定义注解在源码、编译期或运行期的可用性 |
@Documented | 表示注解会包含在 Javadoc 中 |
@Inherited | 表示注解可以被子类继承 |
@Repeatable | 表示注解是可重复的,可以在同一元素上使用多个该注解 |
这些注解的注解为开发者提供了更多的灵活性,能够精细控制注解的行为、生命周期以及如何在类或方法中使用它们。