2013-02-18 3 views
10

Sto avendo il seguente pezzo di codicePerché il valore di un attributo di annotazione dovrebbe essere un'espressione costante?

@UIUnitTimeout(8*60*1000) // works 
@UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work 

So che in base alla JLS solo espressioni costanti sono consentiti come valori agli attributi di annotazione. Ma perché? Perché non è sufficiente se i tipi di dati corrispondono? C'è qualcosa che potrebbe andare storto se le espressioni dovessero essere valutate in fase di runtime? Ogni specifica ha un ragionamento logico dietro?

+0

http://stackoverflow.com/questions/7926596/value-for-the-annotation-attribute-must-be-constant-expression – BobTheBuilder

+0

L'annotazione non dovrebbe essere una costante in fase di compilazione? –

+0

@baraky l'OP sembra già saperlo. – assylias

risposta

9

Un'annotazione è come un'estensione di tipo o metadati relativi al tipo.

Poiché java è un linguaggio tipizzato staticamente (ovvero i tipi sono noti al momento della compilazione), sembra ragionevole che i dati degli attributi di annotazione (metadati) siano noti anche in fase di compilazione - si definiscono/dichiarano dati sull'annotazione (estensione).

E come un punto puramente pratico, per annotation processing, che è una fase di compilazione (opzionale) passo, dati degli attributi must essere noto al momento della compilazione - non si è ancora raggiunto un ambiente di runtime, ma è necessario il attributo dati.

3

La preelaborazione delle annotazioni richiede la conoscenza del valore dell'annotazione prima dell'esecuzione del codice annotato. Inoltre, le definizioni di annotazione sono a loro volta citate con @Retention, che ha un valore di RetentionPolicy (se non specificato, il valore predefinito è CLASS).

Quindi ci sono 3 diversi "tipi" di annotazioni e solo le annotazioni dichiarate come RUNTIME saranno disponibili quando il programma viene eseguito. (Ma il loro valore deve essere costante, in modo che essi rimangono definite senza eseguire il codice associato.)

annotazioni CLASSE devono essere registrati nel file di classe dal compilatore , ma non devono essere trattenuti dal VM a run tempo.

RUNTIME Le annotazioni devono essere registrate nel file di classe dal compilatore e mantenute da la VM in fase di esecuzione, in modo che possano essere lette in modo riflessivo.

SOURCE Le annotazioni devono essere eliminate dal compilatore.

.

+0

Scusa Bohemian, non ho visto il tuo post sull'elaborazione delle annotazioni. – Javier