2016-06-23 8 views
1

Was wird früher verarbeitet - static Block oder annotation?Java Verarbeitungsreihenfolge von Annotation und statischen Blöcken

Zum Beispiel, was ist die Reihenfolge der Verarbeitung der Klasse wie dieses

@CustomAnnotation 
class TemplateClass { 
    static {} 
} 

wo Klasse einige annotation und static Block hat.

+2

- Snip - siehe Antwort :) – Thomas

+0

In welcher Situation wäre es wichtig? Wenn Sie die Anmerkungen einer Klasse abfragen, wurde sie bereits geladen, und somit wurde der statische Initialisierungsblock ausgeführt. Meine Tests zeigen, dass die Annotationen der Klasse noch nicht geladen sind, wenn Sie versuchen, über den statischen Initialisierungsblock der Klasse darauf zuzugreifen. Meine Version von Java ist Oracle Java 1.8.0_20 x64. –

+0

@Thomas Das sollte eine Antwort sein. – Maroun

Antwort

5

Diese werden auf verschiedene Arten verarbeitet, so dass es keine spezifische Reihenfolge gibt. Anmerkungen werden nur in den Klassenmetadaten (Reflektion) gespeichert und müssen über Reflektionscode aufgerufen werden, während statische Blöcke ausgeführt werden, wenn die Klasse selbst vom Klassenlader geladen wird. Die besagte Reflektion kann nur auf die Annotation zugreifen, nachdem die Klasse geladen wurde und somit könnte man sagen, dass der statische Block zuerst ausgeführt wird (es sei denn, du machst etwas böses Reflektionsmaterial darin, in welchem ​​Fall ich nicht sicher bin, was passieren würde) Sie könnten sogar die Anwendung brechen - und jedes Mal, wenn Sie so etwas tun, stirbt ein Kätzchen;)).

Als Beispiel diese betrachten das ist, wie Sie die Anmerkung „Prozess“ könnte:

TemplateClass.class.isAnnotationPresent(CustomAnnotation.class); 

Hier TemplateClass wird zuerst geladen werden, wenn es nicht bereits hat und während, dass der statische Block ausgeführt wird. Nachdem Sie Zugriff auf das geladene Klassenobjekt erhalten haben, wird die Annotation "verarbeitet", indem überprüft wird, ob sie in dieser Klasse vorhanden ist und entsprechende Maßnahmen ergriffen werden.

Bearbeiten: wie von @fabian kommentiert, könnten Sie die Zeile oben im statischen Block ausführen und es sollte funktionieren. Das heißt, die wahrscheinlichere Antwort lautet wahrscheinlich: Der statische Block wird immer noch zuerst ausgeführt, aber die Ausführung wird erst beendet, wenn die Anmerkung "verarbeitet" wurde.

Dort ist eine Möglichkeit, Annotationen vor dem statischen Block zu "verarbeiten": Sie können jedoch zur Kompilierungszeit von einem Annotationsprozessor oder sogar vom Compiler verarbeitet werden, wenn er von diesen Annotationen weiß. @Deprecated wäre ein Beispiel dafür.

Das heißt, wenn und wie Anmerkungen verarbeitet werden, ist nicht von der Annotation selbst abhängen aber auf den Code, der es verwendet.