Java Reference
In-Depth Information
throws Exception
{
Class<?> annoClass = anno.annotationType();
if(annoClass.isInterface())
{
System.out.print("interface ");
}
else
{
//dieser Fall kommt nie vor
System.out.print("class ");
}
System.out.println(annoClass.getName());
System.out.println("{");
Method[] declaredMethods1 = annoClass.getDeclaredMethods();
for(Method m : declaredMethods1)
{
System.out.print(" " + m.getReturnType().getName());
System.out.print(" " + m.getName() + "(): ");
System.out.println(m.invoke(anno, new Object[]{}));
}
System.out.println("}");
}
}
Dieser Code erzeugt die folgende Ausgabe:
interface javacomp.basics.SpecialClass
{
int priority(): 19
java.lang.String scope(): Class
}
Statt durch einen Aufruf von annotationType kann man genau dasselbe Class-Objekt erhal-
ten, indem man auf das von getAnnotations zurückgelieferte Annotation-Objekt zunächst
die Methode getClass aufru (dies liefert das Class-Objekt der nicht näher interessierenden
Klasse) und darauf dann die Methode getInterfaces. Der Aufruf von getInterfaces gibt ein
Class-Feld der Länge 1 zurück, das genau das Class-Objekt erhält, das man durch den Auf-
ruf von annotationType erhält.
So wie es zu der Refl ection-Methode getMethods auch die Singularvariante getMethod gibt,
enthält die Schnittstelle AnnotatedElement, die von Class, Field, Constructor und Method
implementiert wird, auch eine Methode namens getAnnotation. Wie bei getMethod, wo man
den Namen der Methode und ihre Parametertypen angeben muss, muss man die Annota-
tion, nach der man sucht, bereits kennen, da man sie als Parameter vorgeben muss. Dies
dür e in der Praxis der Normalfall sein: In der Regel wird man nämlich überprüfen, ob eine
Klasse, ein Attribut oder ein Methode eine speziell vorgegebene Annotation besitzt, um
dann entsprechend darauf zu reagieren. Die Angabe der Annotation, nach der man sucht,
erfolgt in Form eines Class-Objekts. Es handelt sich dabei genau um das oben diskutierte
Class-Objekt, das die Schnittstelle repräsentiert, die der Annotation entspricht. Die Signatur
der Methode getAnnotation ist nur mit Generics-Kenntnissen zu verstehen:
public <T extends Annotation> T getAnnotation(Class<T> annoClass)
 
Search WWH ::




Custom Search