@target是限定自定义注解适用程序元素的元注解,通过elementtype枚举值(如type、method、field等)指定作用位置,编译器据此检查非法使用并报错,常与@retention配合确保运行时可用。

@Target 是 Java 中用于限定自定义注解可以标注在哪些程序元素上的元注解。它通过指定一个或多个 ElementType 枚举值,明确该注解只能用在类、方法、字段、参数等特定位置,编译器会据此进行检查,非法使用时直接报错。
常用 ElementType 值及对应使用场景
你需要根据注解的实际用途选择合适的类型,常见选项包括:
- TYPE:类、接口、枚举、注解类型(如用在类定义上做配置标识)
- METHOD:方法声明(如权限校验、日志记录等切面场景)
- FIELD:字段(含 enum 常量),不包括局部变量
- PARAMETER:方法或构造器的参数(常用于参数校验)
- LOCAL_VARIABLE:局部变量声明(较少见,需谨慎使用)
- ANNOTATION_TYPE:仅用于其他注解的声明(即元注解)
- CONSTRUCTOR:构造方法
- PACKAGE:包声明(需配合 package-info.java 使用)
@Target 可以指定多个作用位置
如果注解需要灵活用在多个地方,可用大括号包裹多个枚举值:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
注意:不能只写一个值还加花括号(如 @Target({ElementType.METHOD}) 合法,但属于冗余写法;而 @Target(ElementType.METHOD) 更简洁规范)。
错误使用会被编译器拒绝
例如定义了只允许用于方法的注解:
@Target(ElementType.METHOD)
public @interface Loggable { }
若尝试把它加在类上:
@Loggable // 编译错误:Annotation Loggable is not applicable to type
<class>public class UserService { ... }</class>
IDE 和 javac 都会立即提示错误,无需运行时检测,这是静态安全的重要保障。
与 @Retention 配合使用更完整
@Target 控制“能标在哪”,@Retention 控制“保留到什么时候”(SOURCE / CLASS / RUNTIME)。大多数运行时需要反射读取的注解,应同时设置:
<code>@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Retryable { int maxRetries() default 3; }</code>
缺少 @Retention 且设为 CLASS 或 SOURCE 时,反射将无法获取该注解信息。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











