@Target(ElementType.LOCAL_VARIABLE)表示注解仅可用于局部变量声明,必须用数组语法声明,且运行时无法通过反射获取,需编译期或字节码工具处理。

@Target 配置为 ElementType.LOCAL_VARIABLE 时,表示该注解只能标注在局部变量声明处——比如方法体内的普通变量、for 循环变量、try-catch 中的异常参数等。它不能用于字段、参数、方法或类,否则编译直接报错。
写法必须是数组形式
正确写法必须带大括号,且是数组语法:
- @Target({ElementType.LOCAL_VARIABLE}) ✅ 合法
- @Target(ElementType.LOCAL_VARIABLE) ❌ 编译失败(缺少数组括号)
- @Target({ElementType.FIELD, ElementType.LOCAL_VARIABLE}) ❌ 若你只希望限于局部变量,混入其他类型就违背初衷
它覆盖哪些局部变量场景
以下声明位置都算 LOCAL_VARIABLE,可合法使用:
- 普通声明:
int count = 0; - final 变量:
final String tag = "debug"; - for 循环变量:
for (int i = 0; i < 10; i++) { ... } - try-with-resources 资源变量:
try (BufferedReader r = Files.newBufferedReader(p)) { ... } - catch 参数:
catch (IOException e) { ... }中的e
运行时不可反射读取
即使配上 @Retention(RetentionPolicy.RUNTIME),JVM 规范也不允许通过反射获取局部变量上的注解:
立即学习“Java免费学习笔记(深入)”;
-
method.getParameterAnnotations()可读参数注解 -
field.getAnnotations()可读字段注解 但无法通过反射拿到方法体内 <code>int @MyAnno x = 1;的@MyAnno
如需处理这类注解,得借助编译期工具(如 Checker Framework)、字节码解析(ASM/Byte Buddy)或 IDE 插件支持。
搭配 @Retention 才有意义
@Target 只管“能不能写”,真正决定“能不能用”还得靠 @Retention:
- 若想在编译期做检查(如静态分析),用
@Retention(RetentionPolicy.SOURCE) - 若想在字节码中保留并供 AOP 或框架解析(注意:仅对 PARAMETER 有效,LOCAL_VARIABLE 不行),用
@Retention(RetentionPolicy.CLASS)或RUNTIME - 不写 @Retention 默认是 CLASS,但建议显式声明,避免歧义


















