Annotation (Java)

Als Annotation wird im Zusammenhang mit der Programmiersprache Java ein Sprachelement bezeichnet, das die Einbindung von Metadaten in den Quelltext erlaubt. Dieses Element wurde im JSR 175 festgelegt und mit der Version Java 5.0 eingeführt.

Annotationen beginnen mit einem @-Zeichen. Daran schließt sich ihr Name an. Optional kann eine kommagetrennte Parameterliste folgen, die in runden Klammern eingefasst wird. Beispielsweise markiert die Annotation im folgenden Quelltextausschnitt die Klasse A als überholt (deprecated):

@Deprecated
public class A {}

Ein Annotation Processor ist ein Compiler-Plugin, das Annotationen beim Kompilieren auswerten kann, um damit Warnungen und Fehlermeldungen zu unterdrücken oder auszulösen oder weiteren Quellcode oder andere Dateien zu generieren. Mit Annotationen versehenen Code kann er jedoch nicht ändern. Annotationen, bei denen das vorgesehen ist, können auch zur Laufzeit mittels Reflection ausgewertet werden.

Eingesetzt werden Annotationen unter anderem im Java-EE-Umfeld, um Klassen um Informationen zu erweitern, die vor Java 5 in separaten Dateien hinterlegt werden mussten. Prominente Beispiele sind Home- und Local-Interfaces sowie Deployment-Deskriptoren.

Eine Vorgängertechnik zur Einbettung von Metadaten in Java-Quelltexten ist die Verwendung spezieller Javadoc-Kommentare. Diese wurden mit Hilfe sogenannter Doclets ausgewertet. Ein vielfach eingesetztes Werkzeug für diese Methode ist XDoclet. Diese Technik kann auch nach Einführung der Annotationen weiterhin verwendet werden.

Inhaltsverzeichnis

Vordefinierte Annotationstypen

In Java SE 5.0 stehen sieben vordefinierte Annotationstypen zur Verfügung, die in den Paketen (Package) java.lang oder java.lang.annotation liegen. Sie werden alle (im Gegensatz zu den meisten Annotationen) vom Compiler ausgewertet. Weitere können von Programmierern erstellt werden.

Annotation Beschreibung
Im Paket java.lang befinden sich Annotationen für "Normalsterbliche".
@Deprecated Hiermit können Klassen, Attribute oder Methoden gekennzeichnet werden, die nicht mehr verwendet werden sollen. Der Compiler gibt dann eine Warnung aus, wenn ein so gekennzeichnetes Element verwendet wird.

Es empfiehlt sich zusätzlich, einen Javadoc-Kommentar anzubringen, der aufzeigt, wie das entsprechende Element ersetzt werden soll. Das folgende Beispiel zeigt dies:

/**
 * @deprecated  Die Klasse A wurde mit Version 10.3 durch die Klasse ANeu ersetzt.
 */
@Deprecated
public class A {}
@Override Mit diesem Typ kann eine Methode gekennzeichnet werden, die die Methode ihrer Oberklasse überschreibt. Der Compiler stellt dann sicher, dass die Oberklasse diese Methode enthält und gibt einen Fehler aus, wenn dies nicht der Fall ist.

Beispiel:

public class A {
    public void eineMethode() {}
}
 
public class B extends A {
    @Override
    public void eineMethode() {}
}
@SuppressWarnings Bei der Verwendung dieses Annotationstyps unterdrückt der Compiler bestimmte Warnungen. Der Annotation wird dazu ein Array mit Strings übergeben, die die zu unterdrückenden Warnungen enthalten.

Im folgenden Beispiel wird der Compiler angewiesen, die deprecated-Warnung für die Klasse EineDeprecatedKlasse zu unterdrücken:

public class A {
    @SuppressWarnings({"deprecation"})
    public void eineMethode() {
        EineDeprecatedKlasse b = new EineDeprecatedKlasse();
    }
}
Im Paket java.lang.annotation - diese werden nur für die Definition von Annotationen gebraucht.
@Documented Dieser Annotationstyp wird als Meta-Annotation verwendet: Eine Annotation dieses Typs legt für einen neu erstellten Annotationstyp fest, dass er von Javadoc bei der Erzeugung der Dokumentation berücksichtigt wird.
@Inherited Dieser Annotationstyp wird bei der Programmierung einer Annotation angewandt. Damit kann festgelegt werden, dass diese zusammen mit einer Klasse vererbt wird. Wird diese Annotation dann beispielsweise bei einer bestimmten Klasse angewendet, so gilt diese auch für alle Klassen, die von dieser erben.
@Retention Dieser Typ wird bei der Programmierung einer Annotation angewandt. Sie gibt an, wann auf sie selbst zugegriffen werden kann. Es gibt drei mögliche Werte für eine Annotation dieses Typs, die in der Enumeration java.lang.annotation.RetentionPolicy aufgeführt sind:
CLASS
Die Annotation wird mit der Klasse kompiliert und ist damit in der .class-Datei vorhanden. Allerdings kann sie nicht während der Laufzeit einer Anwendung ausgelesen werden. Dies ist der Standardwert.
RUNTIME
Die Annotation kann während der Laufzeit einer Anwendung mittels des Reflection-Mechanismus ausgelesen werden.
SOURCE
Die Annotation wird vor dem Kompilieren aus dem Quelltext entfernt. Entsprechend steht sie zur Laufzeit eines Programms nicht zur Verfügung.
@Target Dieser Annotationstyp wird bei der Programmierung einer Annotation angewandt. Damit wird festgelegt, auf welche Elemente eines Programms sie angewendet werden darf. Die möglichen Werte für eine Annotation dieses Typs sind in der Enumeration java.lang.annotation.ElementType aufgeführt. Ein paar Beispiele:
TYPE
Die Annotation kann nur auf Klassen, Interfaces oder Enumerations angewandt werden.
METHOD
Die Annotation kann nur auf Methoden angewandt werden.
ANNOTATION_TYPE
Die Annotation kann nur auf Annotationen angewandt werden.

Definition eigener Annotationen

Annotationen sind spezielle Schnittstellen; ihre Namen werden daher konventionsgemäß mit großem Anfangsbuchstaben geschrieben. In ihrer Vereinbarung steht vor interface das Zeichen @. Sie erweitern implizit die Schnittstelle java.lang.annotation.Annotation. Sie dürfen keine andere Schnittstellen erweitern (d.h. extends ist verboten) und sind nicht generisch. Ihre Methoden sind parameterlos und nicht-generisch. Als Ergebnistypen (return type) sind nur folgende Typen erlaubt:

  • primitive Typen
  • Aufzählungstypen (enum)
  • Annotationstypen
  • String
  • Class
  • Reihungen (arrays) aus diesen Typen

Sie werfen auch keine Ausnahmen und dürfen nicht Rekursion verwenden.

Viele Annotationen enthalten keine Methoden. Ein Beispiel wäre:

@interface Vorläufig { }

Andere Annotationen enthalten (wie für Schnittstellen üblich) Methoden, allerdings nur mit den oben aufgeführten Ergebnistypen. Wenn eine Annotation nur eine Methode enthält, ist ihr Name konventionsgemäß value:

@interface Test {
        boolean value(); // true solange nicht freigegeben
}

oder

@interface Autoren {
        String[] value(); // Namen der Autoren 
}

oder

@interface Kunden {
        Person[] value(); 
}

wobei Person als Aufzählungstyp (enum) oder Annotation definiert werden muss, z.B.:

@interface Person {
        String name();
        int alter();
}

Bei der Vereinbarung von Annotationen werden häufig die Standard-Annotationen aus dem Paket java.lang.annotation verwendet. Insbesondere soll mit @Retention angegeben werden, wie lange die Annotation aufbewahrt werden soll: nur im Quelltext (SOURCE), in der gespeicherten class-Datei (CLASS) oder auch in der geladenen Klasse (RUNTIME). @Target beschreibt, für welche Programmelemente die Annotation verwendet werden darf. Beispielsweise sind alle Annotationsvereinbarungen im Paket java.lang.annotation mit den Annotationen

@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)

versehen. Hierdurch werden sie alle von javadoc ausgewertet, im Bytecode mit geladen und können so zur Laufzeit ausgewertet werden; des Weiteren dürfen sie nur für Annotationstypen verwendet werden.

Verwendung eigener Annotationen

Eine Annotation ohne Methoden, wie @Vorläufig, kann z.B. einer Klasse vorangestellt werden:

@Vorläufig
class Klasse { 
        void methode(); 
}

Einer Annotation mit nur einer Methode muss in Klammern ein konstanter Wert vom Ergebnistyp dieser Methode mit angegeben werden:

@Test(true)
public void methode() { ... }

Wenn der Ergebnistyp eine Reihung ist, soll ein Reihungsliteral verwendet werden:

@Autoren({"Solymosi", "Grude"})
String buch = "Algorithmen und Datenstrukturen mit Java"

Wenn die Reihung keine Elemente enthält, muss ({}) mit angegeben werden. Wenn die Reihung jedoch nur ein Element enthält, können die geschweiften Klammern weggelassen werden:

@Autoren("Solymosi")
String anderesBuch = "Programmieren in Scala"

Einer Annotation mit mehreren Methoden muss jeder ihrer Methoden in Klammern ein konstanter Wert zugewiesen werden:

@Person(name = "Andreas Solymosi", alter = 56)
Konto konto = new Konto();

Die Möglichkeit, den Wert mit dem Namen anzugeben, besteht auch für Annotationen mit einer Methode (ist allerdings überflüssig, dient höchstens der Lesbarkeit):

@Test(value = true)

Eine komplexe (geschachtelte) Annotation muss geschachtelt angewendet werden:

@Kunden(@Person(name = "Andreas Solymosi", alter = 56))
class Unternehmen {}

In der Vereinbarung der Annotation können für die Methoden Standardwerte definiert werden; dann kann der entsprechende Wert bei der Verwendung weggelassen werden. Da Annotationen Schnittstellen sind, können sie selber mit Annotationen markiert werden:

@Autoren("Solymosi")
public @interface Test {
        boolean wert() default false; // muss nicht unbedingt value heißen
}

Auswertung von Annotationen

Wenn die Annotationen mit dem Bytecode der Klasse geladen werden, können sie mit Hilfe von Reflexion ausgewertet werden. Beispielsweise kann man feststellen, ob eine Annotation angegeben wurde oder nicht:

boolean vorläufig = Klasse.class.isAnnotationPresent(Vorläufig.class);

Wenn man festgestellt hat, dass die Annotation vorhanden ist, dann kann man auch ihren Wert lesen, z.B. ob die Methode noch im Testzustand ist oder nicht:

boolean imTestzustand = Klasse.class.getMethod("methode", new Class[]{}). getAnnotation(Test.class).value();

Wenn hierbei die Annotation nicht vorhanden ist, wird von getAnnotation() die Ausnahme NullPointerException ausgelöst. Aus einer komplexen Annotation müssen ihre Elemente einzeln selektiert werden:

Person kunden = Unternehmen.class.getAnnotation(Kunden.class)[0];

Weblinks


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Annotation (Java) — Pour les articles homonymes, voir Annotation. En programmation, une annotation Java est une façon d ajouter des méta données à un code source Java. Elles peuvent être ajoutées aux classes, méthodes, attributs, paramètres, variables locales et… …   Wikipédia en Français

  • Java (Framework) — Java Objektorientierte Programmiersprache Basisdaten Paradigmen: Objektorientierte Programmiersprache Aktuelle  …   Deutsch Wikipedia

  • Java (Softwaretechnologie) — Java Objektorientierte Programmiersprache Basisdaten Paradigmen: Objektorientierte Programmiersprache Aktuelle  …   Deutsch Wikipedia

  • Java 2 Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java 2 Platform Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java EE — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java Platform Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Annotation (Programmierung) — Annotationen sind ein Mittel zur Strukturierung von Programmquelltexten, bei der die Erzeugung von Programmtexten und mit der Programmierung verbundener Hilfsdateien teilweise automatisiert wird. Als Informationsgrundlage für die automatische… …   Deutsch Wikipedia

  • Annotation — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Une annotation est une note descriptive ajoutée à un document. Une annotation est une note traditionnellement en rouge sur un dessin technique (redlining) …   Wikipédia en Français

  • Java Platform, Standard Edition — or Java SE is a widely used platform for programming in the Java language. It is the Java Platform used to deploy portable applications for general use.In practical terms, Java SE consists of a virtual machine, which must be used to run Java… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”