7

我刚刚在这里进入 javax AnnotationProcessing,并且遇到了一个丑陋的案例。我将用一系列描述我的学习过程的伪代码行来说明它:

MyAnnotation ann = elementIfound.getAnnotation(MyAnnotation.class);
// Class<?> clazz = ann.getCustomClass();  // Can throw MirroredTypeException!
// Classes within the compilation unit don't exist in this form at compile time!

// Search web and find this alternative...

// Inspect all AnnotationMirrors
for (AnnotationMirror mirror : element.getAnnotationMirrors()) {
  if (mirror.getAnnotationType().toString().equals(annotationType.getName())) {
    // Inspect all methods on the Annotation class
    for (Entry<? extends ExecutableElement,? extends AnnotationValue> entry : mirror.getElementValues().entrySet()) {
      if (entry.getKey().getSimpleName().toString().equals(paramName)) {
        return (TypeMirror) entry.getValue();
      }
    }
    return null;
  }
}
return null;

问题是,现在我发现如果客户端代码包含一个核心类,如java.lang.Stringjava.lang.Object作为Class参数,这一行:

return (TypeMirror) entry.getValue();

...导致 a ClassCastException,因为 AnnotationProcessor 环境足以Class在这种情况下实际检索对象。

我已经想出了TypeMirror在没有的情况下如何做我需要做的一切Class——我现在需要在我的代码中处理它们吗?有没有办法TypeMirrorClass对象中获取 a ?因为我找不到

4

1 回答 1

11

我为这个问题采用的解决方案是使用 ProcessingEnvironment 将生成的 Class 对象转换为 TypeMirrors,在我得到类而不是 TypeMirrors 的情况下。这似乎工作得很好。

AnnotationValue annValue = entry.getValue();
if (annValue instanceof TypeMirror) {
  return (TypeMirror) annValue;
}
else {
  String valString = annValue.getValue().toString();
  TypeElement elem = processingEnv.getElementUtils().getTypeElement(valString);
  return elem.asType();
}
于 2013-07-23T18:01:05.717 回答