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

时间:2017-07-23 19:49:03

标签: java reflection annotations

想象一下名为“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;
}

1 个答案:

答案 0 :(得分:2)

MyData无法直接知道它是否已使用MyAnn注释,因为它不知道当前实例是字段还是独立实例,如果它是字段,那么是否该字段已经或未经过MyAnn注释。

因此,您需要以某种方式获取并将value传递给initialize(),并且您需要以value的方式获取initialize() 。从您的代码中可以看出,"something"可以作为参数传递给initialize(),使整个事情比注释字段更容易,然后检查该字段是否已注释。

但无论如何,如果你想检查一个字段是否有注释,你必须:

  • 使用getClass().getDeclaredFields()

  • 获取班级的字段
  • 循环遍历字段;对于每个领域,

    • 调用isAnnotationPresent( MyAnn.class )

    • 调用field.getAnnotations(),为每个注释循环,并检查是否annotation instanceof MyAnn.class

找到注释后,您可以使用annotation.value();

获取其值