home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Einführung

Üblicherweise werden in Java Objekte mittels der Schlüsselworts new instanziert.

Beispiel:

 

Student student = new Student();

 

Dies bedingt jedoch, dass die zu instanzierende Klassen (in unserem Beispiel Student) bereits zur Entwurfszeit, d.h. während der Kodierung, bekannt ist.

Reflection und Introspection erlauben es, zur Laufzeit

  • Klassen anhand ihres Namens zu instanzieren und Methoden aufzurufen (Reflection)
  • konkrete Instanzen von Java-Klassen zu untersuchen (Introspection) und zu ändern (Reflection)

Instanzieren von Klassen

Man bekommt die zu instanzierende Klasse anhand deren qualifizierten Namens über die forName()-Methode auf Class.

Beispiel:

 

Class studentClass = 
Class.forName("org.johner.vorlesung.reflection.Student");

 

Um die Klasse zu instanzieren, muss zuerst der geeignete Konstruktor anhand dessen Signatur ausgewählt werden, was über die Methode getConstructor(Class[] arguments) gelingt.

Beispiel:

 

Constructor constructor = 
studentClass.getConstructor (new Class[]{String.class, int.class});

 

Interessant ist an diesem Beispiel, dass auch die primitiven Datentypen über einen Wrapper dem Konstruktor übergeben werden.

Nun gilt es, ein Objektarray mit den Argumenten zu erstellen, die dem Konstruktor übergeben werden, und dann das Objekt mittels newInstance() zu instanzieren.

Beispiel:

 

Object[] arguments = new Object[] {"Gerd", 123456};
Student student = studentClass.newInstance(arguments);

 

Auch die Methode, die wir auf dem neu instanzierten Objekt aufrufen wollen, wird über deren Namen und ein Klassenarray ausgewählt, das den Übergabeparametern entspricht.

Beispiel:

 

Class[] argumentClass = new Class[]{String.class}
Method setMethod = studentClass.getMethod("setName", arguementClass};
Object[] arguments = new Object[]{"New Name"};
setMethod.invoke(student, arguments);

 

TODO: Bsp. zum Download und als Java2Html anbieten

Untersuchen von Objekten

Die Reflection-API ermöglicht es, Klassen, Objekte und Methoden zur Laufzeit zu untersuchen, ja sogar zu ändern.

Beispiele für Methoden, mit welchen Informationen über Klassen zu erhalten werden können, sind:

     

  • isPrimitive():boolean ist true beispielsweise für int, aber false für Integer
  • getName():String liefert den voll qualifizierten Klassennamen, z.B. org.johner.vorlesung.Beispielklasse
  • getFields():Field[] gibt das Array an Attributen zurück
  • getMethods():Method[] hat das Array an Methoden als Rückgabewert

Entsprechend finden sich auf der Klasse Method die Methoden

     

  • getName():String
  • getParameterTypes():Class[]
  • getReturnType():Class
  • getExceptionTypes():Class[]

Eine vollständige Übersicht liefert die Java-API, beispielsweise unter 

Merkregeln

     

  • Reflection ist ein sehr mächtiges Werkzeug, um Objekte zur Laufzeit aufgrund ihres Names zu erzeugen und stellt damit die Voraussetzung für XML basierte Remote Procedure Calls RPC dar
  • Reflection bietet keine Compilersicherheit
  • Reflection ist deutlich langsamer als zur Entwurfszeit bekannter Code, auch weil der Einsatz des Hotspot-Compilers mit Reflection nicht möglich ist