ElementType.LOCAL_VARIABLE注释类型

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

我自己的注释是这样的:

public void m(int a) @MyOwnAnnotation(some information) int b = 5; } 

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

提前致谢。

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

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

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

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

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

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

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

如果你想要一个临时解决方案, 这里是JSR 308的一个实现 。

目前,正如其他一些post所述,您无法仅从注释中检索局部变量值。

但是,我确实有一个类似的问题,并设法使用字段提出解决方案。 示例代码如下:

接口类

 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface test{ } 

POJO

 public class testObject{ @test private String one; private String two; //Getters and Setters } 

获取对象值

 public void getFields (Object obj){ Field fields = obj.getClass().getDeclaredFields(); for (Field f : fields){ test fieldAnnotation = f.getAnnotation(test.Class); if (fieldAnnotation != null){ f.get(obj); // Do things here based on the values } } } 

主类

 public static void main(String[] args){ //Create object testObject test = new testObject(); test.setOne("testOne"); test.setTwo("testTwo"); getFields(test); } 

希望这有助于解释如何根据注释获取对象的字段。 您只是使用注释来“标记”要检索的字段,然后从对象中读取值。