Java Reference
In-Depth Information
Die generische Methode getAnnotation benötigt als Parameter ein Class<T>-Objekt und lie-
fert dann ein Objekt des Typs T zurück. Hat das Element (Klasse, Attribut, Methode usw.),
auf das man die Methode getAnnotation anwendet, die betreff ende Annotation nicht, wird
null zurückgeliefert. Im folgenden Beispiel, in dem wir noch einmal die Klasse X verwen-
den, gehen wir davon aus, dass X mit @SpecialClass annotiert ist. Wir prüfen deshalb nicht
auf null ab:
Class<?> c = Class.forName("javacomp.basics.X");
SpecialClass s = c.getAnnotation(SpecialClass.class);
System.out.print("priority = " + s.priority());
System.out.println(", scope = " + s.scope());
Im Beispiel hat der Parameter beim Aufruf von getAnnotation den Typ Class<SpecialClass>.
Der Rückgabetyp ist deshalb SpecialClass. Man muss also bei der Zuweisung des Rückgabe-
werts an die lokale SpecialClass-Variable nicht casten.
Will man nur wissen, ob eine Annotation vorhanden ist oder nicht, so gibt es noch die
Methode isAnnotationPresent. Dies ist die vierte Methode der Schnittstelle AnnotatedEle-
ment, die von Class, Field, Constructor und Method implementiert wird:
public boolean isAnnotationPresent(Class<? extends Annotation> cl)
Zum Abschluss dieses Abschnitts soll noch erwähnt werden, dass sich Annotationen lokaler
Variablen mit Refl ection nicht auslesen lassen.
3 . 5 Beispiel
Wie im Kapitel über Refl ection kann man ein Programm schreiben, das alle Annotationen
von Klassen, deren Namen als Kommandozeilenargumente dem Programm mitgegeben
werden, mitsamt ihren Werten ausgibt. Der Abdruck des Programms würde wieder sehr
viel Platz beanspruchen, den wir einsparen wollen. Der Kern des Programms ist die Methode
printAnnotation aus Listing 3.1. Diese Methode wird für alle Annotationen der Klasse sowie
jedes Attributs, jedes Konstruktors und jeder Methode der Klasse aufgerufen. Als Beispiel
betrachten wir die annotierte Klasse aus Listing 3.2, wobei die Deklaration der Annotatio-
nen weggelassen wird.
Listing 3.2 Beispielprogramm zum Auslesen von Annotationen
package javacomp.basics;
@SpecialClass(scope="Class", priority=12)
public class AnnotatedClass
{
@SpecialField(name="Field")
private int i;
private String s;
@SpecialConstructor(priority = 3)
 
Search WWH ::




Custom Search