Java 如何读取类中字段的运行时注释

Java 如何读取类中字段的运行时注释,java,reflection,annotations,Java,Reflection,Annotations,想象一下,一个名为“MyAnn”的注释具有运行时保留、一个类MyClass和一个名为MyData的抽象类。MyClass有一个MyData类型的字段,用MyAnn注释。在MyData实例中,如何查看注释MyAnn是否存在并检索其信息 注意——在Java8中,我知道我们可以在构建时直接注释内部类——这是可行的——但我需要基于字段注释的工作 谢谢你的帮助 public MyClass extends MySuperClass() { @MyAnn(value = "something")

想象一下,一个名为“MyAnn”的注释具有运行时保留、一个类MyClass和一个名为MyData的抽象类。MyClass有一个MyData类型的字段,用MyAnn注释。在MyData实例中,如何查看注释MyAnn是否存在并检索其信息

注意——在Java8中,我知道我们可以在构建时直接注释内部类——这是可行的——但我需要基于字段注释的工作

谢谢你的帮助

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”,这是它自己的声明。我想不出一个简单的方法来做到这一点。。。