Java Reference
In-Depth Information
2.1 Grundlagen von Refl ection
In diesem ersten Abschnitt über Refl ection berücksichtigen wir die Tatsache, dass die durch
R e fl ection beschriebenen Klassen, Schnittstellen und Methoden Generics verwenden kön-
nen, zunächst noch nicht. Wie Refl ection für Generics erweitert wurde, erfahren Sie dann
in Abschnitt 2.2.
2.1.1 Die Klasse Class
Die zentrale Klasse von Refl ection ist Class. Ein Objekt der Klasse Class beschreibt eine
Klasse. Es gibt eine ganze Reihe von Möglichkeiten, wie man an ein Class-Objekt gelangt.
Wenn man schon ein Objekt der Klasse hat, dann kann man sich mit getClass einfach das
dazugehörige Class-Objekt geben lassen (X sei irgendeine Klasse):
X x = new X();
Class<?> c = x.getClass();
Wie oben zu sehen ist, ist die Klasse Class eine generische Klasse. Der Typparameter ist die
Klasse, die vom Class-Objekt beschrieben wird (in obigem Beispiel also Class<X>). Da get-
Class eine Methode der Klasse Object ist, muss der Rückgabetyp für alle Objekte aller mög-
lichen Klassen passen; er ist deshalb Class<?>. Es wäre zwar oben möglich, auf Class<X> zu
casten. Dies hat aber eine (unterdrückbare) Warnung zur Folge, da eine vollständige Typ-
überprüfung zur Laufzeit nicht möglich ist, wie im vorherigen Kapitel schon erläutert
wurde. Weil man aber weiß , dass die Variable x vom Typ X ist, muss das Objekt, das durch
x referenziert wird, vom Typ X oder einer aus X abgeleiteten Klasse sein. Der Typparameter
kann deshalb zumindest auf X eingeschränkt werden:
Class<? extends X> c = x.getClass();
Eine weitere Möglichkeit, an ein Class-Objekt zu gelangen, ist in folgendem Beispiel zu
sehen:
Class<X> c = X.class;
In diesem Fall kann das Class-Objekt einer Variablen des Typs Class<X> ohne Warnungen
zugewiesen werden, da der Compiler überprüfen kann, dass es sich in diesem Fall tatsäc h -
lich um ein Class<X>-Objekt handeln muss. (Bitte beachten Sie, dass dies im ersten Fall bei
der Verwendung von getClass im Allgemeinen nicht geht, da bei der Zuweisung an die
Variable x nicht immer die Anwendung des Operators new im Spiel sein muss, sondern es
könnte z. B. auch sein, dass der Rückgabewert irgendeiner Methode an x zugewiesen wird.
Diese Methode könnte auch ein Objekt einer von X abgeleiteten Klasse zurückgeben.) Bei
der Verwendung von .class muss sich die Programmiererin allerdings bereits beim Schrei-
ben ihres Programms auf die Klasse X festlegen; dies kann zur Laufzeit nicht mehr geändert
werden (X ist statisch in den Programmcode „eingebrannt“). Wenn man sich das Class-
Objekt von der statischen Methode forName der Klasse Class geben lässt, muss die Festle-
gung auf eine bestimmte Klasse nicht zur Programmierzeit erfolgen. Als Parameter benötigt
die Methode forName den vollständigen Klassennamen (d. h. einschließlich des Package-
 
Search WWH ::




Custom Search