Java 如何读取类中字段的运行时注释
想象一下,一个名为“MyAnn”的注释具有运行时保留、一个类MyClass和一个名为MyData的抽象类。MyClass有一个MyData类型的字段,用MyAnn注释。在MyData实例中,如何查看注释MyAnn是否存在并检索其信息 注意——在Java8中,我知道我们可以在构建时直接注释内部类——这是可行的——但我需要基于字段注释的工作 谢谢你的帮助Java 如何读取类中字段的运行时注释,java,reflection,annotations,Java,Reflection,Annotations,想象一下,一个名为“MyAnn”的注释具有运行时保留、一个类MyClass和一个名为MyData的抽象类。MyClass有一个MyData类型的字段,用MyAnn注释。在MyData实例中,如何查看注释MyAnn是否存在并检索其信息 注意——在Java8中,我知道我们可以在构建时直接注释内部类——这是可行的——但我需要基于字段注释的工作 谢谢你的帮助 public MyClass extends MySuperClass() { @MyAnn(value = "something")
public MyClass extends MySuperClass() {
@MyAnn(value = "something")
protected MyData mydata;
public void doSomething() {
mydata = new MyData() {};
mydata.initialize();
}
}
public abstract MyData() {
String myValue = null;
public void initialize() {
if (***I am annotated with MyAnn) {
myValue = (***value from annotation MyAnn);
}
}
}
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnn {
String myvalue;
}
MyData
无法直接知道是否已使用MyAnn
对其进行了注释,因为它不知道当前实例是字段还是独立实例,如果是字段,则不知道该字段是否已使用MyAnn
进行了注释
因此,您需要以某种方式获取值并将其传递给initialize()
,并且需要以某种方式在调用initialize()
的位置获取值。从您的代码中,似乎可以将“something”
作为参数传递给initialize()
,这比注释字段然后检查字段是否已注释容易得多
但在任何情况下,如果要检查字段是否已注释,必须:
- 使用
getClass().getDeclaredFields()
- 在田野上绕圈子;对于每个字段
- 调用
isAnnotationPresent(MyAnn.class)
或
- 调用
field.getAnnotations()
,循环每个注释,并检查MyAnn.class的注释实例是否为
找到注释后,可以使用annotation.value()获取其值
请注意,MyData
的实例需要有关MyData
字段的详细信息。使用这里提供的方法,有必要知道在编译时声明相应字段的类。@Izruo我不理解您的评论,但无论如何,它让我重新思考我的答案,所以我修改了它。我相信@lzruo指出的是,对于“mydata”实例为了能够使用您描述的技术(迭代字段并检查注释)内省父类,它需要一种方法来“识别”自己,例如,如何知道它何时到达父类中的字段“mydata”,这是它自己的声明。我想不出一个简单的方法来做到这一点。。。