Java ElementType.LOCAL_变量注释类型

Java ElementType.LOCAL_变量注释类型,java,reflection,annotations,Java,Reflection,Annotations,我想创建自己的注释来注释一些局部变量。编写注释不是问题,问题是在运行时获取注释的信息。我只能从带注释的方法或方法参数中获取一些信息,而不能从局部变量中获取。有什么办法得到它吗 我自己的注释是这样的: public void m(int a) @MyOwnAnnotation(some information) int b = 5; } 或者,作为替代方案,是否有任何方法可以获取方法的代码,进一步解析它并最终获得注释值 提前感谢。使用反射,您无法检索局部变量。因此,无法通过反射检

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

我自己的注释是这样的:

public void m(int a)  
@MyOwnAnnotation(some information)  
int b = 5;  
}  
或者,作为替代方案,是否有任何方法可以获取方法的代码,进一步解析它并最终获得注释值


提前感谢。

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

你可以看看

无论在注释类型上设置了什么保留策略,局部变量注释都不会保留在类文件中(或在运行时)。见JLS 9.6.1.2


如果不想检索方法代码,可以使用JavaParser()。

JLS 9.6.1.2确实声明不保留局部变量注释。然而,该组织正在社区进程中努力。它应该给你所需要的能力


如果您想要一个临时解决方案,.

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


但是,Java的反射API尚未更新,无法在方法体中提供访问权限。您需要自己解析类文件。您可以使用诸如的工具编辑:我不推荐JavaParser,因为它还没有更新到Java1.5之外。已经更新。

目前,正如其他一些帖子中提到的,您无法仅从注释中检索局部变量值

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

接口类

PoJo

获取对象值

主类


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

您在另一条注释中的链接给出了答案:类文件格式不支持它。如果您愿意,我可以通过JVM规范的链接和解释给出答案,但我认为其他问题几乎涵盖了这一点。我感到惊讶的是,
apt
没有给你你所需要的。不同的说法是:“[…]Java编译器必须确保
a
以出现
a
的类或接口的二进制表示形式表示,除非
m
注释局部变量声明。局部变量声明上的注释永远不会保留在二进制表示形式中。”
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface test{
}
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);
}