【问题标题】:How to get annotation parameter in annotation processor如何在注释处理器中获取注释参数
【发布时间】:2019-03-02 20:45:30
【问题描述】:

我正在编写自己的注解处理器,我正在尝试获取我的注解参数,如下面的代码中的处理方法:

roundEnv.getElementsAnnotatedWith(annotation).forEach {
        val annotation = it.getAnnotation(annotation)
        annotation.interfaces
}

在构建过程中我得到的是An exception occurred: javax.lang.model.type.MirroredTypesException: Attempt to access Class objects for TypeMirrors []。有人知道如何获取注释数据吗?

【问题讨论】:

    标签: java kotlin annotations annotation-processing


    【解决方案1】:

    getAnnotation 方法的文档解释了为什么 Class<?> 对象对注释处理器有问题:

    此方法返回的注解可能包含一个值为 Class 类型的元素。此值不能直接返回:定位和加载类所需的信息(例如要使用的类加载器)不可用,并且该类可能根本无法加载。尝试通过在返回的注解上调用相关方法来读取 Class 对象将导致 MirroredTypeException,从中可以提取相应的 TypeMirror。同样,尝试读取 Class[]-valued 元素将导致 MirroredTypesException。

    要访问类等注释元素,您需要改用Element.getAnnotationMirrors() 并手动查找感兴趣的注释。这些注释镜像将包含表示实际值的元素,但不需要存在相关类。

    【讨论】:

      【解决方案2】:

      这个blog post 似乎是如何做到这一点的规范来源。它引用了 Sun 论坛的讨论,并在许多注释处理器中被引用。

      对于以下注释:

      @Documented
      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.METHOD)
      public @interface Action {
          Class<?> value();
      }
      

      可以通过这段代码访问Class&lt;?&gt;类型的字段:

      for (ExecutableElement ee : ElementFilter.methodsIn(te.getEnclosedElements())) {
          Action action = ee.getAnnotation(Action.class);
          if (action == null) {
              // Look for the overridden method
              ExecutableElement oe = getExecutableElement(te, ee.getSimpleName());
              if (oe != null) {
                  action = oe.getAnnotation(Action.class);
              }
          }
      
          TypeMirror value = null;
          if (action != null) {
              try {
                  action.value();
              } catch (MirroredTypeException mte) {
                  value = mte.getTypeMirror();
              }
          }
      
          System.out.printf(“ % s Action value = %s\n”,ee.getSimpleName(), value);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 2013-08-04
        • 2013-07-13
        • 1970-01-01
        相关资源
        最近更新 更多