@target用于限定注解的适用位置,如elementtype.type限于类、接口、枚举和注解类型;支持数组组合多目标;需配合@retention指定保留策略,runtime才可在运行时反射获取。

@Target 是 Java 中用于明确限定自定义注解能用在哪些程序元素上的元注解。它不决定注解“做什么”,而是回答“能贴在哪”——就像给标签印上适用范围说明书。
ElementType.TYPE:作用于类、接口、枚举和注解类型
当你写 @Target(ElementType.TYPE),表示该注解只能标注在顶层类型声明处:
- 普通类(
class):如@MyAnnotation public class UserService { ... } - 接口(
interface):如@MyAnnotation public interface Repository { ... } - 枚举(
enum):如@MyAnnotation public enum Status { ACTIVE, INACTIVE } - 注解类型(
@interface):如@MyAnnotation public @interface ApiVersion { ... }
注意:内部类(非静态嵌套类)、方法、字段、参数等都不符合 TYPE 的定义,强行使用会编译报错。
支持多目标时用数组形式组合
一个注解常需跨多个位置生效,比如既要修饰类又要修饰方法。这时传入 ElementType 数组即可:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
@Target({ElementType.TYPE, ElementType.METHOD})→ 可用于类或方法 -
@Target({ElementType.FIELD, ElementType.PARAMETER})→ 可用于字段或方法参数 - 不能省略大括号:写成
@Target(ElementType.TYPE, ElementType.METHOD)是语法错误
常见 ElementType 值与典型用途对照
除 TYPE 外,其他常用值也值得记住:
-
FIELD:成员变量、枚举常量(如
@Autowired) -
METHOD:方法声明(如
@Override、@GetMapping) -
PARAMETER:方法形参(如
@RequestParam) -
CONSTRUCTOR:构造方法(如 Lombok 的
@RequiredArgsConstructor) - ANNOTATION_TYPE:专门修饰其他注解(即元注解自身)
@Target 必须配合 @Retention 才完整
只声明作用位置还不够,还要说明注解保留到哪个阶段:
-
@Retention(RetentionPolicy.SOURCE):仅编译期可见,源码处理工具可用(如 Lombok) -
@Retention(RetentionPolicy.CLASS):写入 .class 文件但运行时不可反射获取 -
@Retention(RetentionPolicy.RUNTIME):运行时可通过Class.getAnnotation()读取(最常用)
没有 @Retention 的自定义注解默认为 CLASS 级别,若想在运行时解析,必须显式声明 RUNTIME。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










