我想创建自己的注释来注释一些局部变量。写注解不是问题,问题是在运行时获取它们的信息。我只能从带注释的方法或方法参数中获取一些信息,而不能从局部变量中获取。有没有办法得到它?
我自己的注释是这样的:
public void m(int a)
@MyOwnAnnotation(some information)
int b = 5;
}
或者,作为替代方案,有没有办法获取方法的代码,进一步解析它并最终获得注释值?
提前致谢。
我想创建自己的注释来注释一些局部变量。写注解不是问题,问题是在运行时获取它们的信息。我只能从带注释的方法或方法参数中获取一些信息,而不能从局部变量中获取。有没有办法得到它?
我自己的注释是这样的:
public void m(int a)
@MyOwnAnnotation(some information)
int b = 5;
}
或者,作为替代方案,有没有办法获取方法的代码,进一步解析它并最终获得注释值?
提前致谢。
使用反射,您无法检索局部变量。因此,您无法通过反射检索局部变量上的注释。我认为这种注释仅用于编译器警告。
你可以看看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 的反射 API 尚未更新以提供方法主体内的访问权限。您需要自己解析类文件。您可以使用ASM等工具。 编辑:我不推荐 JavaParser,因为它在 Java 1.5 之后还没有更新。 JavaParser已更新。
JLS 9.6.1.2 确实声明不保留局部变量注释。但是,JSR 308正在通过社区流程进行工作。它应该为您提供所需的能力。
如果您想要一个临时解决方案,这里是 JSR 308 的实现。
目前,正如其他一些帖子中提到的,您不能仅从注释中检索局部变量值。
但是,我确实遇到了类似的问题,并设法使用字段提出了解决方案。示例代码如下:
接口类
@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);
}
希望这有助于解释如何根据注释获取对象的字段。您只是使用注释来“标记”要检索的字段,然后从对象中读取值。