ElementType.LOCAL_VARIABLE注释类型

时间:2013-06-21 14:31:14

标签: java reflection annotations

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

我自己的注释是这样的:

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

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

提前致谢。

4 个答案:

答案 0 :(得分:18)

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

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

  

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

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

答案 1 :(得分:10)

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

但是,Java的反射API尚未更新,无法在方法体内进行访问。您需要自己解析类文件。您可以使用ASM等工具。 编辑我不推荐使用JavaParser,因为它已经超出了Java 1.5。 JavaParser已经更新。

答案 2 :(得分:3)

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

如果您想要临时解决方案,here is an implementation of JSR 308

答案 3 :(得分:-3)

目前,正如其他一些帖子所述,您无法仅通过注释来检索局部变量值。

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

接口类

@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);
}

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