Java Getriebe

Java und NetBeans

Annotations – geheimnisvolle Markierungen im Quelltext

This entry is part 1 of 1 in the series Annotation Processor
  • Annotations – geheimnisvolle Markierungen im Quelltext

Seit der Version 1.5 kennt Java die so genannten Annotations. Die meisten Java Entwickler werden dieses Sprachkonstrukt nur als „Nutzer“ erfahren. Jeder wird schon mal eine @[javadoc]java.lang.Deprecated[/javadoc] oder @[javadoc]java.lang.SuppressWarnings[/javadoc] Annotation genutzt oder zumindest gesehen haben. Unter bestimmten Voraussetzungen kann es aber durchaus interessant sein eigene Annotations zu schreiben.

Dabei muss man im Grunde genommen zwei grundlegende Verwendungsarten der Annotations unterscheiden

  1. Meta-Informationen zu einem Element des Java Quelltextes, die zur Laufzeit des Programms ausgewertet werden sollen und
  2. Automatisches Generieren von zusätzlichen Dateien und auch Klassen während des Compiliervorgangs.

Wohl gemerkt, es handelt sich um die Verwendungsart. Die Art und Weise, wie eine Annotation angelegt oder im Quelltext zu einem Element hinzugefügt wird unterscheidet sich nicht.

Punkt 1 wird über die Reflection API von Java abgefragt. Alle entsprechenden Klassen wie [javadoc]java.lang.Class[/javadoc], [javadoc]java.lang.reflect.Method[/javadoc] oder auch [javadoc]java.lang.Package[/javadoc] besitzen eine Methode <T extends Annotation> T getAnnotation(Class<T> annotationClass). Schlüssel zu dem ganzen ist das Interface [javadoc]java.lang.reflect.AnnotatedElement[/javadoc] in dem die Zugriffsmethoden deklariert sind und das von allen Elementen an denen ich Annotations „anheften“ kann implementiert wird. Der Rest sollte relativ selbsterklärend sein, wie man an seine Daten gelangt.

Interessanter wird da schon der 2. Punkt. Er kann dazu verwendet werden um zum Beispiel automatisch irgendwelche .properties Dateien mit Einstellungen zu erstellen oder Einträge im „META-INF“ Verzeichnis anzulegen. Dazu schreibt man eine Art „Plug-In“ für den Compiler selbst. Dieses Plug-In wird während des Compiliervorgangs der Klassen mit den Annotations ausgeführt und hat Zugriff auf alle Daten aus dem Quelltext der Klasse oder den andern Klassen, die der Compiler gerade verarbeitet. Außerdem lassen sich ohne genaue Kenntnisse der aktuellen Verzeichnisstrukturen Dateien an definierten Punkten (etwa „Quellenverzeichnis“ oder „Ausgabeverzeichnis“) lesen oder erstellen.

Zudem kann man diese eigene Implementierung von [javadoc]javax.annotation.processing.Processor[/javadoc] dazu nutzen Fehleingaben des Nutzers der Annotation zu prüfen und so schon zur Compilierzeit Probleme feststellen, die eventuell sonst erst zur Laufzeit erkannt würden, wenn auch die Daten der Annotation zugegriffen wird. Wie genau dies funktioniert, möchte ich dem ein oder anderen Beitrag in diesem Blog noch einmal ausführlicher beschreiben.