我正在编写自己的注释处理器,并且试图获取注释参数,如下面的处理方法中的代码所示:
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 []
。有人知道如何获取注释数据吗?
答案 0 :(得分:4)
关于getAnnotation
方法的文档解释了为什么Class<?>
对象对于注释处理器来说是有问题的:
此方法返回的注释可以包含其值为Class类型的元素。该值不能直接返回:定位和加载类所需的信息(例如要使用的类加载器)不可用,并且该类可能根本无法加载。尝试通过在返回的注释上调用相关方法来读取Class对象,将导致MirroredTypeException,可以从中提取相应的TypeMirror。同样,尝试读取Class []值的元素将导致MirroredTypesException。
要访问类之类的注释元素,您需要改为使用Element.getAnnotationMirrors()
并手动找到感兴趣的注释。这些注释镜像将包含表示实际值的元素,但不需要存在相关类。
答案 1 :(得分:0)
此 blog post 似乎是有关如何执行此操作的规范来源。它引用了 Sun 论坛的讨论,并在许多注释处理器中被引用。
对于以下注释:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Action {
Class<?> value();
}
Class<?>
类型的字段可以通过以下代码访问:
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);
}