@Target(ElementType.PARAMETER)限定注解仅可用于方法或构造器参数,需配合@Retention(RetentionPolicy.RUNTIME)才能在运行时通过反射获取,支持多类型如{PARAMETER, LOCAL_VARIABLE},误用会编译报错。

@Target(ElementType.PARAMETER) 用于将自定义注解限定只能用在方法或构造器的参数位置,不能用在类、字段、返回值等其他地方。
配置方式很简单
在自定义注解声明时,用 @Target 指定 ElementType.PARAMETER 即可:
@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)
public @interface NotNull {
String value() default "";
}
这样定义后,该注解只能写在参数上,比如:
public void updateUser(@NotNull String name, @NotNull Integer age) { ... }如果误用在其他位置(如类上、字段上),编译器会直接报错。
立即学习“Java免费学习笔记(深入)”;
支持多个 ElementType 的写法
一个注解可以同时作用于多个位置,比如既支持参数又支持局部变量:
@Target({ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})@Retention(RetentionPolicy.RUNTIME)
public @interface LogValue { }
注意:多个类型要用大括号包裹,逗号分隔。
常见搭配建议
- 必须配合 @Retention 设置保留策略,通常用 RUNTIME,否则运行时无法通过反射获取
- 若只做编译检查(如 Lombok 或 IDE 提示),可用 SOURCE 策略
- 不建议单独用 PARAMETER,常和 METHOD、CONSTRUCTOR 一起组合,覆盖更完整的调用入口场景
- 框架如 Spring、Hibernate 会读取 PARAMETER 注解做参数校验或绑定,确保注解可见性(RUNTIME)
验证是否生效的小技巧
写个测试类,尝试把注解加到非法位置:
@NotNull // 编译失败:Annotation @NotNull is not applicable to this locationpublic class UserService { }
编译器会提示 “Annotation is not applicable”,说明 @Target 配置已起效。


















