【问题标题】:how to read runtime annotations on a field within a class如何读取类中字段的运行时注释
【发布时间】:2017-07-24 04:23:46
【问题描述】:

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

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    MyData不能直接知道自己是否被MyAnn注解过,因为它不知道当前实例是字段还是独立实例,如果是字段,那么字段是否有或没有被MyAnn注解。

    因此,您将需要以某种方式获取value 并将其传递给initialize(),并且您将需要以某种方式在调用initialize() 的位置获取value。从您的代码来看,"something" 似乎可以作为参数传递给initialize(),这比注释字段然后检查字段是否已注释要容易得多。

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

    • 通过getClass().getDeclaredFields()获取您班级的字段

    • 循环遍历字段;对于每个字段,要么

      • 调用isAnnotationPresent( MyAnn.class )

      • 调用field.getAnnotations(),循环每个注解,检查这个annotation instanceof MyAnn.class

    找到注解后,可以通过annotation.value();获取其值

    【讨论】:

    • 请注意,MyDatainstance 需要MyData字段 的详细信息。使用此处提供的方法,有必要知道在编译时声明相应字段的类。
    • @Izruo 我不明白你的评论,但无论如何,它让我重新思考我的答案,所以我修改了它。
    • 我相信@lzruo 指出的是,对于能够使用您描述的技术(遍历字段并检查注释)来自省其父类的实例“mydata”,它需要一种方法来“识别”自己,例如如何知道它何时到达父类中的字段“mydata”,这是它自己的声明。我想不出一个简单的方法来做到这一点......
    猜你喜欢
    • 2016-04-15
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多