Java Reference
In-Depth Information
In den folgenden Codezeilen gehen wir davon aus, dass die Klasse X genau diese eine Anno-
tation @SpecialClass hat. Wir casten das erste (und einzige) Annotationsobjekt im von
getAnnotations zurückgelieferten Feld ohne weitere Prüfung auf SpecialClass. Damit kön-
nen wir dann die Attributwerte 19 und „Class“ für diese Annotation auslesen:
Class<?> c = Class.forName("javacomp.basics.X");
Annotation[] classAnnotations = c.getAnnotations();
SpecialClass s = (SpecialClass) classAnnotations[0];
System.out.print("priority = " + s.priority());
System.out.println(", scope = " + s.scope());
Die Ausgabe dieser Codezeilen ist:
priority = 19, scope = Class
Wenn man nicht weiß , welche Annotationen vorhanden sind, kann man auf jedes Annota-
tion-Objekt die parameterlose Methode annotationType anwenden. Diese liefert ein Objekt
des Typs Class<? extends Annotation> zurück. Dieses Class-Objekt repräsentiert die zu der
Annotation gehörende Schnittstelle. Das heißt, für das obige Beispiel erhalten wir ein Class-
Objekt, das die Schnittstelle SpecialClass mit den Methoden priority und scope repräsen-
tiert. Mit Hilfe von Refl ection lassen sich die Methoden jeder Annotation aufrufen (ohne
dass man beim Programmieren wissen muss, welche Methoden die Annotation mitbringt).
Damit lassen sich dann die Werte der Annotation bestimmen. Der Aufruf erfolgt durch das
Anwenden der Methode invoke auf das dazugehörige Method-Objekt. Als Parameter von
invoke muss das Objekt angegeben werden, auf das die durch das Method-Objekt repräsen-
tierte Methode angewendet werden soll; das ist in diesem Fall das Annotationsobjekt. Fer-
ner müssen die Argumente für den Methodenaufruf angegeben werden. Da alle Methoden
einer Annotation parameterlos sein müssen, wird deshalb als zweites Argument von invoke
ein Object-Feld der Länge 0 übergeben. Das Programm in Listing 3.1 illustriert diesen Sach-
verhalt:
Listing 3.1 Programm zum Auslesen von Annotationen mit Refl ection
package javacomp.basics;
public class Main
{
public static void main(String[] args)
{
try
{
Class<?> c = Class.forName("javacomp.basics.X");
Annotation[] classAnnotations = c.getAnnotations();
for(Annotation anno : classAnnotations)
{
printAnnotation(anno);
}
}
catch(Exception e)
{
}
}
private static void printAnnotation(Annotation anno)
 
Search WWH ::




Custom Search