ElementType.LOCAL_VARIABLE注释类型

Dmi*_*sky 14 java reflection annotations

我想创建自己的注释来注释一些局部变量.编写注释不是问题,问题是在运行时获取它们的信息.我只能从带注释的方法或方法参数中获取一些信息,但不能从局部变量中获取.有没有办法得到它?

我自己的注释是这样的:

public void m(int a)  
@MyOwnAnnotation(some information)  
int b = 5;  
}  
Run Code Online (Sandbox Code Playgroud)

或者,作为替代方案,有没有办法获取方法的代码,进一步解析它,最后得到注释值?

提前致谢.

Pom*_*Pom 20

使用反射,您无法检索局部变量.因此,您无法通过反射检索局部变量上的注释.我认为这种注释仅用于编译器警告.

您可以查看http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html

无论注释类型上设置的保留策略如何,本地变量注释都不会保留在类文件中(或在运行时).见JLS 9.6.1.2.

如果您不想检索方法代码,可以使用JavaParser(http://javaparser.org/).


mer*_*nst 12

从Java 8开始,局部变量注释保留在类文件中.正如Erick Hagstrom所指出的,这个长期存在的错误由JSR 308修复,它还为Java语言添加了类型注释.

但是,Java的反射API尚未更新,无法在方法体内进行访问.您需要自己解析类文件.您可以使用ASM等工具.我不推荐使用JavaParser,因为它还没有在Java 1.5之外更新.

  • [JLS 9.6.4.2. @Retention](https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.2) 说了一些不同的东西:_"[...] Java 编译器必须确保 `a` 以出现 `a` 的类或接口的二进制表示形式表示,除非 `m` 注释局部变量声明。局部变量声明上的注释永远不会保留在二进制表示形式中。” _ (2认同)

Eri*_*rom 5

JLS 9.6.1.2 确实声明不保留局部变量注释。但是,JSR 308正在通过社区流程发挥作用。它应该为您提供所需的功能。

如果您需要临时解决方案,这里是 JSR 308 的实现