元注解:是用于注解其他注解的注解。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;
}