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.
- Snip - siehe Antwort :) – Thomas
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. –
@Thomas Das sollte eine Antwort sein. – Maroun