www.wikidata.de-de.nina.az
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 eingefuhrt Annotationen beginnen mit einem Zeichen Daran schliesst 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 uberholt deprecated Deprecated public class A Ein Annotation Processor ist ein Compiler Plugin das Annotationen beim Kompilieren auswerten kann um damit Warnungen und Fehlermeldungen zu unterdrucken oder auszulosen oder weiteren Quellcode oder andere Dateien zu generieren Mit Annotationen versehenen Code kann er jedoch nicht andern Annotationen bei denen das vorgesehen ist konnen auch zur Laufzeit mittels Reflection ausgewertet werden Eingesetzt werden Annotationen unter anderem im Jakarta 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 Vorgangertechnik zur Einbettung von Metadaten in Java Quelltexten ist die Verwendung spezieller Javadoc Kommentare Diese wurden mit Hilfe sogenannter Doclets ausgewertet Ein vielfach eingesetztes Werkzeug fur diese Methode ist XDoclet Diese Technik kann auch nach Einfuhrung der Annotationen weiterhin verwendet werden Inhaltsverzeichnis 1 Vordefinierte Annotationstypen 2 Definition eigener Annotationen 3 Verwendung eigener Annotationen 4 Auswertung von Annotationen 5 Annotation von Paketen 6 WeblinksVordefinierte Annotationstypen BearbeitenIn Java SE 5 0 stehen sieben vordefinierte Annotationstypen zur Verfugung 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 konnen von Programmierern erstellt werden Annotation BeschreibungIm Paket java lang befinden sich Annotationen Deprecated Hiermit konnen 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 zusatzlich 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 uberschreibt Der Compiler stellt dann sicher dass die Oberklasse diese Methode enthalt 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 unterdruckt der Compiler bestimmte Warnungen Der Annotation wird dazu ein Array mit Strings ubergeben die die zu unterdruckenden Warnungen enthalten Im folgenden Beispiel wird der Compiler angewiesen die deprecated Warnung fur die Klasse EineDeprecatedKlasse zu unterdrucken public class A SuppressWarnings deprecation public void eineMethode EineDeprecatedKlasse b new EineDeprecatedKlasse SafeVarargs Mit dieser Annotation wird versichert dass die Varargs Parameter mit Generics nicht zur Laufzeit mit einem unpassenden Generics Typ ersetzt werden Beim Aufruf der Methode bzw des Konstruktors wird dann keine Warnung angezeigt Die Annotation wurde mit Java 7 eingefuhrt Bis Java 6 konnte man beim Aufruf mit einer SuppressWarnings Annotation das Vertrauen in den aufgerufenen Code dokumentieren ab Java 7 kann die Methode sich selbst als vertrauenswurdig deklarieren Im Paket java lang annotation diese werden nur fur die Definition von Annotationen gebraucht Documented Dieser Annotationstyp wird als Meta Annotation verwendet Eine Annotation dieses Typs legt fur einen neu erstellten Annotationstyp fest dass er von Javadoc bei der Erzeugung der Dokumentation berucksichtigt 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 fur 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 mogliche Werte fur eine Annotation dieses Typs die in der Enumeration java lang annotation RetentionPolicy aufgefuhrt sind CLASS Die Annotation wird mit der Klasse kompiliert und ist damit in der class Datei vorhanden Allerdings kann sie nicht wahrend der Laufzeit einer Anwendung ausgelesen werden Dies ist der Standardwert RUNTIME Die Annotation kann wahrend 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 Verfugung Target Dieser Annotationstyp wird bei der Programmierung einer Annotation angewandt Damit wird festgelegt auf welche Elemente eines Programms sie angewendet werden darf Die moglichen Werte fur eine Annotation dieses Typs sind in der Enumeration java lang annotation ElementType aufgefuhrt TYPE Die Annotation kann nur auf Klassen Interfaces oder Enumerations angewandt werden FIELD Die Annotation kann nur auf Felder angewandt werden METHOD Die Annotation kann nur auf Methoden angewandt werden Konstruktoren sind dabei ausgeschlossen PARAMETER Die Annotation kann nur auf Parameter von Methoden und Konstruktoren angewandt werden CONSTRUCTOR Die Annotation kann nur auf Konstruktoren angewandt werden LOCAL VARIABLE Die Annotation kann nur auf lokale Variablen angewandt werden ANNOTATION TYPE Die Annotation kann nur auf Annotationen angewandt werden PACKAGE Die Annotation kann nur auf Paketen angewandt werden Definition eigener Annotationen BearbeitenAnnotationen sind spezielle Schnittstellen ihre Namen werden daher konventionsgemass mit grossem Anfangsbuchstaben geschrieben In ihrer Vereinbarung steht vor b interface b das Zeichen Sie erweitern implizit die Schnittstelle java lang annotation Annotation Sie durfen keine andere Schnittstellen erweitern d h b extends b ist verboten und sind nicht generisch Ihre Methoden sind parameterlos und nicht generisch Als Ergebnistypen return type sind nur folgende Typen erlaubt primitive Typen Aufzahlungstypen b enum b Annotationstypen String Class Felder arrays aus diesen TypenSie werfen auch keine Ausnahmen und durfen keine Rekursion verwenden Viele Annotationen enthalten keine Methoden Ein Beispiel ware interface Vorlaeufig Andere Annotationen enthalten wie fur Schnittstellen ublich Methoden allerdings nur mit den oben aufgefuhrten Ergebnistypen Wenn eine Annotation nur eine Methode enthalt ist ihr Name konventionsgemass 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 Aufzahlungstyp b enum b oder Annotation definiert werden muss z B interface Person String name int alter Bei der Vereinbarung von Annotationen werden haufig 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 fur 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 konnen so zur Laufzeit ausgewertet werden ausserdem durfen sie nur fur Annotationstypen verwendet werden Verwendung eigener Annotationen BearbeitenEine Annotation ohne Methoden wie Vorlaeufig kann z B einer Klasse vorangestellt werden Vorlaeufig class Klasse void methode Einer Annotation mit nur einer Methode mit dem Namen value muss in Klammern ein konstanter Wert vom Ergebnistyp dieser Methode mit angegeben werden Test true public void methode Wenn der Ergebnistyp ein Array ist soll ein Arrayliteral verwendet werden Autoren Solymosi Grude String buch Algorithmen und Datenstrukturen mit Java Wenn das Array keine Elemente enthalt muss mit angegeben werden Wenn das Array jedoch nur ein Element enthalt konnen 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 Moglichkeit den Wert mit dem Namen anzugeben besteht auch fur Annotationen mit einer Methode ist allerdings uberflussig dient hochstens 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 konnen fur die Methoden Standardwerte definiert werden dann kann der entsprechende Wert bei der Verwendung weggelassen werden Da Annotationen Schnittstellen sind konnen sie selber mit Annotationen markiert werden Autoren Solymosi public interface Test boolean wert default false muss nicht unbedingt wert heissen Auswertung von Annotationen BearbeitenWenn die Annotationen mit dem Bytecode der Klasse geladen werden konnen sie mit Hilfe von Reflexion ausgewertet werden Beispielsweise kann man feststellen ob eine Annotation angegeben wurde oder nicht b boolean b istVorlaeufig Klasse b class b isAnnotationPresent Vorlaeufig b class b 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 Test test Klasse b class b getMethod methode b new b Class getAnnotation Test b class b value Wenn hierbei die Annotation nicht vorhanden ist wird von getAnnotation die Ausnahme NullPointerException ausgelost Aus einer komplexen Annotation mussen ihre Elemente einzeln selektiert werden Person kunden Unternehmen b class b getAnnotation Kunden b class b value 0 Annotation von Paketen BearbeitenDie Java Language Specification erlaubt auch die Annotation von Paketen beispielsweise um Dokumentation zu einem Paket bereitzustellen Pro Paket darf maximal eine package Deklaration mit Annotationen versehen sein Falls ein Paket Annotationen erhalten soll empfiehlt die Java Language Specification eine gesonderte Datei namens package info java im Verzeichnis dieses Pakets anzulegen Diese Datei beinhaltet dann die package Deklaration mit den Annotationen Weblinks BearbeitenAnnotationen in Java Annotations in Suns Java Tutorial englisch Annotation Processing Tool apt englisch The J2SE 5 0 Annotations Feature bei Sun englisch JSR 175 A Metadata Facility for the JavaTM Programming Language englisch Annotations in der Java Language Specification englisch Annotationen in Java ist auch eine Insel Abgerufen von https de wikipedia org w index php title Annotation Java amp oldid 234607306