2012-05-09 10 views
6

Durante la creazione delle classi utilizzando Generators, è possibile scoprire tutte le sottoclassi di un tipo. Potete trovare questa tecnica, ad esempio nella fonte Showcase GWT (vedi full code):È possibile trovare tutte le classi annotate con @MyAnnotation usando GWT GeneratorContext?

JClassType cwType = null; 
try { 
    cwType = context.getTypeOracle().getType(ContentWidget.class.getName()); 
} catch (NotFoundException e) { 
    logger.log(TreeLogger.ERROR, "Cannot find ContentWidget class", e); 
    throw new UnableToCompleteException(); 
} 
JClassType[] types = cwType.getSubtypes(); 

Vorrei fare qualcosa di simile, ma invece di estendere una classe (o di implementazione di un'interfaccia)

public class SomeWidget extends ContentWidget { ... } 

, potrei farlo anche con annotando Widget?

@MyAnnotation(...) 
public class SomeWidget extends Widget { ... } 

E quindi trovare tutti i widget annotati con @MyAnnotation? Non sono riuscito a trovare un metodo come JAnnotationType.getAnnotatedTypes(), ma forse sono solo cieco?

Nota: Sono stato in grado di farlo funzionare con la libreria Google Reflections, utilizzando reflections.getTypesAnnotatedWith(SomeAnnotation.class), ma io preferisco usare il GeneratorContext invece, soprattutto perché questo funziona molto meglio quando ricaricare l'applicazione in DevMode.

risposta

8

Sì, il modo più semplice è iterare attraverso tutti i tipi e controllarli per l'annotazione. Potresti avere anche altre regole (è pubblico, non astratto) che dovrebbero essere fatte anche in quel momento.

for (JClassType type : oracle.getTypes()) { 
    MyAnnotation annotation = type.getAnnotation(MyAnnotation.class); 
    if (annotation != null && ...) { 
    // handle this type 
    } 
} 

Il TypeOracle esempio possono essere ottenute dalla GeneratorContext utilizzando context.getTypeOracle().

Si noti che questo consentirà solo l'accesso ai tipi sul percorso di origine. Cioè, solo i tipi attualmente disponibili in base ai moduli ereditati e ai tag <source> in uso.

+0

+1, che funziona decisamente, e non ho considerato questo approccio. È una specie di metodo a forza bruta (che non importa troppo dato che nessuno avrà milioni di tipi). Accetterò volentieri la tua risposta, se non esiste una soluzione predefinita per questo. –

+0

Sembra una forza bruta dal punto di vista della maggior parte di Java, ma all'interno del percorso sorgente non sarà così male. Inoltre, questo è ciò che dovrà fare anche la funzione nella libreria di Google Reflections: trova e guarda tutte le classi attualmente sul classpath. –

Problemi correlati