Pregunta

I'm just getting into javax AnnotationProcessing over here, and have run into an ugly case. I'll illustrate it in a series of pseudo-code lines that describe my learning process:

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;

The problem is that now I'm finding out that if the client code contains a core class like java.lang.String or java.lang.Object as a Class parameter, this line:

return (TypeMirror) entry.getValue();

...results in a ClassCastException, because the AnnotationProcessor environment is kind enough to actually retrieve the Class object in this case.

I've figured out how to do everything I need to do with TypeMirror in the absence of Class - do I need to handle both of them in my code now? Is there a way to obtain a TypeMirror from a Class object? Because I can't find one

¿Fue útil?

Solución

The solution I went with for this problem was to use the ProcessingEnvironment to cast the resultant Class objects to TypeMirrors, in the cases when I got classes instead of TypeMirrors. This seems to work fairly well.

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top