2013-02-18 11 views
10

Mam następujący fragment koduDlaczego wartość atrybutu adnotacji powinna być wyrażeniem stałym?

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

wiem, że zgodnie z JLS tylko wyrażenia stałe są dopuszczone jako wartości atrybutów adnotacji. Ale dlaczego? Dlaczego nie jest wystarczające, jeśli typy danych są zgodne? Czy jest coś, co mogłoby pójść nie tak, jeśli wyrażenia miały być oceniane w czasie wykonywania? Czy każda specyfikacja ma logiczne uzasadnienie?

+0

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

+0

Czy adnotacja nie powinna być stałą czasu kompilacji? –

+0

@baraky OP wydaje się już to wiedzieć. – assylias

Odpowiedz

9

Adnotacja jest jak rozszerzenie typu lub metadane dotyczące typu.

Ponieważ java jest językiem napisanym statycznie (co oznacza, że ​​typy są znane w czasie kompilacji), rozsądne wydaje się, że dane atrybutu adnotacji (metadane) również są znane podczas kompilacji - definiujesz/deklarujesz dane o adnotacji (rozbudowa).

I jako czysto praktycznego punktu, dla annotation processing, który jest kompilacji (opcjonalnie) krok, dane atrybutów koniecznością być znany w czasie kompilacji - nie osiągnęły jeszcze środowiska wykonawczego, ale potrzebne są dane atrybutów.

3

Wstępne przetwarzanie adnotacji wymaga znajomości wartości adnotacji przed wykonaniem przypisanego kodu. Ponadto definicje adnotacji są opatrzone przy pomocy @Retention, która ma wartość RetentionPolicy (jeśli nie jest określona, ​​domyślnie jest to KLASA).

W związku z tym istnieją 3 różne "rodzaje" adnotacji, a tylko te adnotacje zadeklarowane jako RUNTIME będą dostępne po uruchomieniu programu. (Ale ich wartość musi być stała, tak że pozostają one zdefiniowane bez wykonywania skojarzony kod.)

CLASS adnotacje mają być zapisane w pliku klasy przez kompilator ale nie muszą być zatrzymywane przez VM na metę czas.

RUNTIME Adnotacje powinny być zapisywane w pliku klasy przez kompilator i zachowywane przez maszynę wirtualną w czasie wykonywania, aby mogły być odczytywane w odbiciu.

SOURCE Adnotacje należy odrzucić przez kompilator.

.

+0

Przepraszam, Bohemian, nie widziałem Twojego posta o przetwarzaniu adnotacji. – Javier

Powiązane problemy