9.8 Annotationen 

Seit Java 5 gibt es eine in die Programmiersprache eingebaute Fähigkeit für Metadaten: Annotationen. Das folgende Beispiel zeigt einen denkbaren Einsatz für Web-Services.
import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class Calculator { @WebMethod public int add( int x, int y ) { return x + y; } }
Die Annotationen sind Auszeichnungen der Metadaten und beginnen mit einem @-Zeichen, wie auch die JavaDoc-Tags mit einem solchen Zeichen beginnen. (Das @-Zeichen, AT, ist auch eine gute Abkürzung für Annotation Type.) Hinter dem @ steht ein Bezeichner, der im Allgemeinen ein Wie-Wort (für die Linguisten: Adjektiv) sein sollte.
9.8.1 Annotationstypen 

Oft haben wir schon Anwendungen vom Annotationstyp @Override gesehen. Daneben gibt es im Paket java.lang zwei weitere Annotationstypen. Zusammengefasst ergeben sich:
@Override |
Die annotierte Methode überschreibt eine Methode aus der Oberklasse oder implementiert eine Methode einer Schnittstelle. |
@Deprecated |
Das markierte Element ist veraltet und sollte nicht mehr verwendet werden. |
@SuppressWarnings |
Unterdrückt bestimmte Compiler-Warnungen. |
Die drei Annotationen haben vom Compiler beziehungsweise Laufzeitsystem eine besondere Semantik. Einige weitere Annotationen, die nur für eigene Annotationstypen gedacht sind, beleuchtet das Kapitel 23 näher.
Begriffe Annotation und Annotationstyp
Die Annotationstypen sind die Deklarationen wie etwa ein Klassentyp. Werden sie an ein Element gehängt, ist es eine konkrete Annotation. Während also Override selbst der Annotationstyp ist, ist @Override vor toString() die konkrete Annotation.
@Deprecated
Die Annotation @Deprecated übernimmt die gleiche Aufgabe wie das JavaDoc-Tag @deprecated. Ein Unterschied bleibt: Das JavaDoc-Tag kann nur vom JavaDoc (beziehungsweise einem anderen Doclet) ausgewertet werden, während Annotationen auch andere Tools selbst zur Laufzeit auswerten können.
@Deprecated public void fubar() { ... }
Falls ein Programmstück die @Deprecated-Methode fubar() [Im US-Militär-Slang steht das für: »Fucked up beyond any recognition«. ] nutzt, gibt der Compiler eine einfache Meldung aus. Die Übersetzung mit dem Schalter -Xlint:deprecation liefert die genauen Warnungen; im Moment ist das mit -deprecation gleich.
Annotationen mit zusätzlichen Informationen
Die Annotationen @Override und @Deprecated gehören zur Klasse der Marker-Annotationen, weil keine zusätzlichen Angaben nötig (und erlaubt) sind. Zusätzlich gibt es die »Single-value annotation«, die genau eine zusätzliche Information bekommt, und eine volle Annotation mit beliebigen Schlüssel/Werte-Paaren.
@Annotationstyp |
Marker-Annotation |
@Annotationstyp( Wert ) |
Annotation mit genau einem Wert |
@Annotationstyp( Schlüssel1=Wert1, Schlüssel2=Wert2, ... ) |
Volle Annotation mit Schlüsse/Werte-Paaren |
@SuppressWarnings
Die Annotation @SuppressWarnings steuert Compiler-Warnungen. Unterschiedliche Werte bestimmen genauer, welche Hinweise unterdrückt werden. Beliebt ist die Annotation bei der Umstellung von älterem Quellcode mit nicht-typisierten Datenstrukturen, um die Anzahl der Warnungen zu minimieren. Da sich mit Java 5.0 das Klassenformat änderte, gibt der Compiler beim Übersetzen älterer Klassen schnell eine »unchecked«-Meldung aus.
Listing 9.26 com/tutego/insel/annotation/SuppressWarningsDemo.java, main() @SuppressWarnings( "unchecked" ) public static void main( String[] args ) { ArrayList list = new ArrayList(); list.add( "SuppressWarnings" ); } Die Annotation der lokalen Variable funktioniert nicht! |
@SuppressWarnings("unchecked") ist eine Abkürzung von @SuppressWarnings(value= {"unchecked"});. Die zweite Schreibweise macht deutlich, dass ein Feld von Strings übergeben werden kann.
9.8.2 Common Annotations 

In Java 6 sind über die JSR 250 »Common Annotations« weitere Annotationen für Java SE und Java EE eingezogen. Obwohl in der Java Standard Edition die Annotationen kaum eine Rolle spielen, sind sie doch eine wichtige Ausgangsbasis für Enterprise Frameworks. Folgende Annotationen sind im Paket javax.annotation enthalten:
- javax.annotation.Generated
- javax.annotation.Resource, javax.annotation.Resources
- javax.annotation.PostConstruct, javax.annotation.PreDestroy
- javax.annotation.security.RunAs
- javax.annotation.security.RolesAllowed
- javax.annotation.security.PermitAll, javax.annotation.security.DenyAll
9.8.3 Annotationen für Web-Services 

Unser erstes Beispiel für Annotationen zeigt ihren Einsatz zur Definition von Web-Services. Die Annotationen wurden erstmalig im JSR 181 »Web Services Metadata for the Java Platform« definiert und sind nun Teil von Mustang. Das Kapitel 18 beschäftigt sich etwas ausführlicher mit den Annotationen unter dem Paket javax.jws. Des Weiteren sind Annotationen aus einer zweiten JSR 224 eingezogen, die den Titel »Java API for XML-Based Web Services (JAX-WS) 2.0« trägt. Die Annotationen sowie Klassen und Schnittstellen teilen sich das Paket javax.xml.ws.
9.8.4 Annotationen für XML-Mapping 

Teil der JSR 222 sind neue Annotationen für die Abbildung von XML-Dokumenten auf Objekte und umgekehrt. Das Paket javax.xml.bind.annotation umfasst dazu etwa 30 Annotationen.