Java中的元注解

99 阅读2分钟

元注解:是用于注解其他注解的注解。Java5 引入了元注解,它们提供了一种方式来定义和限制其他注解的行为。

@Target

作用:指定注解可以应用的目标元素类型。

源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    // ElementType 是一个枚举,指定可以应用的目标类型
    ElementType[] value();
}

ElementType 支持的值:

ElementType说明
ElementType.TYPE可以应用在类、接口或枚举声明上。
ElementType.METHOD可以应用在方法声明上。
ElementType.FIELD可以应用在字段声明上。
ElementType.PARAMETER可以应用在方法的参数上。
ElementType.CONSTRUCTOR可以应用在构造方法上。
ElementType.LOCAL_VARIABLE可以应用在局部变量上。
ElementType.ANNOTATION_TYPE可以应用在注解类型声明上。
ElementType.PACKAGE可以应用在包声明上。

@Retention

作用:用于指定注解的保留策略,即指明注解的生命周期。

源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    // RetentionPolicy 是一个枚举,指定注解的保留策略。
    RetentionPolicy value();
}

RetentionPolicy 支持的值:

RetentionPolicy说明
RetentionPolicy.SOURCE注解仅存在于源代码中,在编译时会被编译器丢弃。
RetentionPolicy.CLASS注解会被保留到编译时期,在编译后的 class 文件中存在。
RetentionPolicy.RUNTIME注解会被保留到运行时,可以通过反射等机制获取到这些注解信息。

@Inherited

作用:用于指示一个注解是否应该被子类继承。

源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

@Documented

作用:用于指定注解是否应该被包含在生成的 API 文档中。

源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Repeatable

作用:Java8 引入的元注解,允许注解在一个元素上多次使用。它需要指定注解的容器类型,用于存储重复的注解。

源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
    // 指定注解的容器类型
    Class<?> value();
}

@Deprecated

作用:用于标记类、方法、字段等已经过时,建议不再使用。

源码:

@Documented
@Retention(RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
    // 指示自哪个版本起该元素已被弃用。默认值为空字符串。
    String since() default ""; 
    // 指示该元素是否预定在未来版本中被移除。默认值为 false。
    boolean forRemoval() default false; 
}

@AliasFor

作用:用于指示注解属性之间的别名关系。

源码:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface AliasFor {
    // 指定别名所指向的注解中的属性名。
    @AliasFor("attribute")
    String value() default "";

    @AliasFor("value")
    String attribute() default "";
    // 指定别名所指向的注解类型。
    Class<? extends Annotation> annotation() default Annotation.class;
}