Java Reference
In-Depth Information
fen werden kann. Dies funktioniert auch für Klassen, die nicht im Quellcode vorliegen,
sondern nur als übersetzter Code zum Beispiel in einer Jar-Datei. Über Refl ection kann
die Entwicklungsumgebung mühelos herausfi nden, welche Methoden und Attribute eine
Klasse besitzt und diese dann zur Auswahl anbieten.
Noch intensiver wird Refl ection in BlueJ verwendet. In BlueJ kann man interaktiv eine
beliebige Klasse auswählen und sich ein Objekt davon erzeugen lassen; BlueJ bietet den
Anwendern dazu eine Liste mglicher Konstruktoren und fragt die Parameterwerte ab,
nachdem man sich für einen Konstruktor entschieden hat. Für alle so erzeugten Objekte
kann man sich die aktuellen Werte der Attribute anzeigen lassen (ohne dass es dafür Get-
ter-Methoden geben muss). Man kann auf ein zuvor erzeugtes Objekt auch jede mögliche
Methode anwenden, wobei dazu wie im Falle des Konstruktors die Parameterwerte inter-
aktiv erfragt werden.
Ein weiteres Beispiel für den Einsatz von Refl ection ist RMI (Remote Method Invocation).
Wenn Sie RMI kennen, dann werden Sie wissen, dass man damit Methoden auf Objekte, die
sich in einem anderen Prozess und eventuell sogar auf einem anderen Rechner befi nden,
anwenden kann. Die Java-Laufzeitumgebung stellt dafür u. a. ein sogenanntes RMI-Skeleton
bereit. Das ist So ware, die über eine Netzverbindung Daten empfängt, die angeben, welche
Methode auf welchem Objekt mit welchen Argumenten aufgerufen werden soll. Das RMI-
Skeleton führt den entsprechenden Aufruf dann auch aus. Da die Skeleton-So ware unab-
hängig von einer konkreten RMI-Anwendung programmiert wurde, kann ein solcher Metho-
denaufruf nur über Refl ection (das heißt über die Methode invoke der Klasse Method)
realisiert werden.
Zur Abrundung dieser Aufzählung über Anwendungen, die Refl ection einsetzen, wollen wir
noch einmal auf die Problematik zurückkommen, die wir im vorhergehenden Kapitel über
Generics besprochen haben, dass nämlich der Ausdruck new T() für einen Typparameter
T einen Compilerfehler verursacht. Mit Refl ection erhält man als So ware-Entwickler
jedoch die Möglichkeit, Programmcode zu schreiben, der ein Objekt, dessen Typ zur Pro-
grammierzeit noch nicht bekannt ist, erzeugt. Im Folgenden gehen wir der Einfachheit hal-
ber davon aus, dass jeder konkrete Typ, der für T eingesetzt wird, einen parameterlosen
Konstruktor besitzen wird. Dann kann man z. B. folgende generische Methode zum Erzeu-
gen eines Objekts programmieren:
class X
{
public static <T> T newInstance(Class<T> c) throws Exception
{
return c.newInstance();
}
}
Die Methode kann dann zum Beispiel zum Ausprobieren so aufgerufen werden:
Class<?> c = Class.forName("java.lang.String");
String s = (String) X.newInstance(c);
c = Class.forName("java.lang.StringBuffer");
StringBuffer s2 = (StringBuffer) X.newInstance(c);
 
Search WWH ::




Custom Search