Java Reference
In-Depth Information
Methods; die Declared-Variante beschränkt sich auf die Annotationen in der betrachteten
Klasse, während die Variante ohne Declared auch vererbte Annotationen mit einbezieht
(wie in Abschnitt 3.2 kurz angesprochen wurde, werden Annotationen, die mit der Meta-
Annotation @Inherited markiert sind, vererbt). Wie schon besprochen wurde, kann eine
Klasse, Attribut, Methode usw. mit mehreren Annotationen versehen sein. Deshalb ist der
Rückgabetyp der Methoden getAnnotations und getDeclaredAnnotations ein Feld des Typs
Annotation.
Parameter von Konstruktoren und Methoden können ebenfalls annotiert werden. Deshalb
haben die beiden Klassen Constructor und Method auch noch die Methode getParameter-
Annotations. Der Rückgabetyp ist in diesem Fall ein zweidimensionales Feld des Typs
Annotation (Annotation[][]), denn ein Konstruktor und eine Methode können mehrere Para-
meter haben, und jeder Parameter kann mehrfach annotiert sein.
Die von den erwähnten Methoden zurückgelieferten Annotationsobjekte sind Objekte
irgendwelcher nicht näher interessierenden Klassen. Eine solche Klasse implementiert eine
Schnittstelle, die man aus einer Annotationsdeklaration erhält, wenn man das Schlüssel-
wort @interface gedanklich durch interface ersetzt. Über diese Schnittstelle kann man dann
durch Aufruf ihrer Methoden die Attributwerte der betreff enden Annotation auslesen. Alle
diese Schnittstellen sind abgeleitet aus der Schnittstelle Annotation, die in den soeben
beschriebenen Methoden bei der Rückgabe vorkommt. Die Schnittstelle Annotation ist im
Package java.lang.annotation defi niert.
Diese Sachverhalte sind vermutlich ohne Beispiel schwer zu verstehen. Betrachten wir die
zuvor schon einmal gezeigte Annotation @SpecialClass für Klassen und Schnittstellen:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SpecialClass
{
public String scope();
public int priority();
}
Diese Annotation werde für eine Klasse X wie folgt verwendet:
package javacomp.basics;
@SpecialClass(priority=19, scope="Class")
public class X
{
}
Wenn wir getAnnotations auf das Class-Objekt, welches die Klasse X repräsentiert, aufru-
fen, erhalten wir ein Feld des Typs Annotation mit der Länge 1, da die Klasse X genau eine
Annotation hat. Das einzige Objekt in diesem Feld implementiert die Schnittstelle Special-
Class. Die Deklaration der Schnittstelle SpecialClass müssen wir uns so vorstellen, als ob in
der Deklaration der Annotation @SpecialClass @interface durch interface ersetzt worden
wäre. SpecialClass ist aus der Schnittstelle Annotation abgeleitet, so dass der Rückgabetyp
Annotation[] passend ist.
 
Search WWH ::




Custom Search