Metodo process
process
è il metodo principale del processore di annotazioni, esso viene invocato almeno una volta durante l'esecuzione dell'annotation processing. Nell'esempio proposto in questa breve trattazione, la prima operazione che verrà eseguita con questo metodo sarà andare a cercare tutte le classi annotate con @Convert
.
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// iteriamo su tutti gli elementi con l'annotazione @Convert
for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Convert.class)) {
...
}
}
Gli elementi analizzati possono essere sia classi che interfacce. Per distinguere i due casi potrebbe rivelarsi conveniente adottare un controllo simile a quello riportato di seguito:
// verifica che l'annotazione @Convert sia su una classe
if (annotatedElement.getKind() != ElementKind.CLASS) {
...
}
Nel caso specifico non si può impiegare un controllo del tipo annotatedElement instanceof TypeElement
in quanto anche le interfacce sono di tipo TypeElement
. Una buona abitudine nella scrittura di annotation process è quella di evitare l'uso di instanceof e di usare piuttosto la proprietà Kind
della classe Element
.
Processing Rounds
I processori vengono istanziati una volta sola dal compilatore. Il metodo process
viene invocato una o più volte, a seconda del fatto che durante un round venga generato qualche nuovo elemento. Questo è dovuto al fatto che anche le nuove classi potrebbero contenere delle annotazioni da gestire e quindi è necessario invocare il processore anche su di esse. Nel nostro esempio, ci si aspetta che il processore di annotazioni venga eseguito in 3 round:
Round | Input | Output |
---|---|---|
1 | Persona.java , ... |
PersonaConverter.java |
2 | PersonaConverter.java |
-- |
3 | -- | -- |
Il metodo process
smette di essere invocato non appena sono state analizzate tutte le classi con le annotazioni gestite dal processore di annotazioni.
Gestione degli errori
Nel metodo init
è possibile ottenere una reference ad un oggetto di tipo Messager
. Esso fornisce un valido strumento per l'annotation processing al fine di riportare messaggi di errore, di warning e altre notifiche.
Il tipo di messaggio più importante è Kind.ERROR
, che viene usato per segnalare il fallimento del processore di annotazioni. Un'eventuale eccezione nel metodo process
provoca la chiusura della Java Virtual Machine creata per eseguire il processore di annotazione. Il metodo più lineare per informare il compilatore che qualcosa è andato male, consiste invece nell'utilizzare il messager
per indicare la presenza di un errore.