@target是限定自定义注解适用位置的元注解,通过elementtype枚举数组指定合法目标(如method、field等),误用时编译报错;需配合@retention使用,如@target(elementtype.method) @retention(retentionpolicy.runtime)。

@Target 是 Java 中用于指定自定义注解可以被应用在哪些程序元素上的元注解。它通过传入一个 ElementType 枚举数组,明确限定该注解的合法使用位置,比如只能用在方法上、不能用在类上等。如果注解被误用(如用在不支持的位置),编译器会直接报错,提升代码安全性与可维护性。
理解 ElementType 枚举值
Java 提供了多个 ElementType 常量,每个代表一种可标注的语法结构:
-
TYPE:类、接口、枚举、注解类型(即@interface) -
METHOD:方法声明 -
FIELD:字段(包括 enum 常量) -
CONSTRUCTOR:构造方法 -
PARAMETER:方法或构造器参数 -
LOCAL_VARIABLE:局部变量(注意:运行时不可见,反射拿不到) -
ANNOTATION_TYPE:仅用于其他注解的声明(即标注在@interface上) -
PACKAGE:包声明(需配合@Retention(RetentionPolicy.SOURCE)使用) -
TYPE_PARAMETER:泛型类型参数(如<t extends object></t>) -
TYPE_USE:任何类型使用处(如泛型、强制转换、new表达式等),需搭配@Retention(RetentionPolicy.CLASS)或更长生命周期
常见用法示例
定义一个只允许用在方法上的注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
若尝试将其加在字段上:
public class Example {
@LogExecutionTime // 编译错误:Annotation @LogExecutionTime is not applicable to field
private String name;
}
定义一个可同时用于方法和构造器的注解:
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface Auditable {
}
组合多个 ElementType 的写法
当需要支持多种目标时,用大括号包裹多个枚举值,注意是数组字面量语法:
- 正确:
@Target({ElementType.METHOD, ElementType.FIELD}) - 错误:
@Target(ElementType.METHOD, ElementType.FIELD)(缺少花括号和数组符号) - 错误:
@Target(ElementType.METHOD | ElementType.FIELD)(位运算不适用)
@Target 和其他元注解的协作
@Target 通常与 @Retention 和 @Documented 等配合使用:
-
@Retention决定注解保留到哪个阶段(SOURCE / CLASS / RUNTIME) - 若注解需在运行时通过反射读取,必须设为
RetentionPolicy.RUNTIME -
@Target(ElementType.TYPE_USE)要求至少RetentionPolicy.CLASS,否则无法生效
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











