2013-07-15 30 views
5

Sadece javax AnnotationProcessing'e giriyorum ve çirkin bir vakaya girdim. Benim öğrenme sürecini açıklamak sözde kod hattı dizisinin bunu açıklayacağız:Handle TypeMirror ve Class incelikle

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; 

sorun olduğunu şimdi bulmaya ediyorum istemci kodu java.lang.String veya java.lang.Object olarak böyle bir çekirdek sınıfı içeriyorsa bir Class parametre, bu satırı: bir ClassCastException içinde

return (TypeMirror) entry.getValue(); 

... sonuçlar, AnnotationProcessor ortamı nezaketinde aslında bu durumda Class nesneyi almak için çünkü.

Class'un yokluğunda TypeMirror ile yapmam gereken her şeyi nasıl yapacağımı anladım - her ikisini de şimdi kodumda işlemem gerekiyor mu? Class nesnesinden TypeMirror elde etmenin bir yolu var mı? Çünkü bir

cevap

7

Bu sorun için gittiğim çözüm, TypeMirrors yerine sınıflarım olduğu durumlarda, sonuçta oluşan Class nesnelerini TypeMirrors'a dökmek için ProcessingEnvironment'ı kullanmaktı. Bu oldukça iyi çalışıyor gibi görünüyor.

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(); 
} 
+0

Genellikle ek açıklama işlemcisi API'sı konuşurken, getKind, getTypeKind, vb. – Snicolas