Skip to content

注解的注解

在 Java 中,注解本身也可以被注解。常见的注解有:

  1. @Target
  2. @Retention
  3. @Documented
  4. @Inherited
  5. @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表示注解是可重复的,可以在同一元素上使用多个该注解

这些注解的注解为开发者提供了更多的灵活性,能够精细控制注解的行为、生命周期以及如何在类或方法中使用它们。