Reflection API1 Motivation Reflection API Core Reflection API: java.lang.reflect Seit JDK 1.1 integraler Bestandteil der Java- Klassenbibliothek Ermöglicht: –Laden und Instanzieren von Klassen, ohne dass Name zur Compilezeit bekannt –Methoden aufrufen und auf Membervariablen zugreifen, wenn Name erst zur Laufzeit des Programmes bekannt
Reflection API2 Notwendigkeit Ermöglicht Zugriff auf (public) Informationen über Klassen (Metainformationen), deren: –Quellcode nicht vorhanden und/oder –Aufbau nicht bekannt ist Für Entwicklung der Beans- und Serialisierungs- APIs benötigt Für Debugger, GUI-Builder, Class-Browser
Reflection API3 Ausgangspunkt: Klasse Class im Paket java.lang Instanzen dieser Klasse repräsentieren Klassen + Interfaces laufender Java Anwendung Instanzen automatisch durch JVM konstruiert Instanz abfragbar, wenn: –Objekt der Klasse verfügbar, mit: Class c = o.getClass(); –Name der Klasse zur Compilezeit bekannt, mit: Class c = java.awt.Button.class; –Klassenname zur Lauf- aber nicht zur Compilezeit, mit: Class c = Class.forName(strg);
Reflection API4 Zugriff auf Klassenbestandteile für dynamischen Zugriff auf Klassenbestandteile Klassen: Constructor, Method und Field –repräsentieren entsprechenden Klassenbestand- teil –haben Methoden zum Aufrufen (Constructor, Method) oder –Methoden zum Auslesen + Setzen (Field) Instanzen nicht direkt erzeugt, sondern mit Me- thoden der Klasse Class z.B. getField() erst Class-Objekt, dann Bestandteile ermitteln
Reflection API5 Metainformationen Klassennamen ermitteln: Class c = o.getClass(); System.out.println(c.getName()); Ermittlung der Methoden einer Klasse: Class c = o.getClass(); Method m[] = c.getMethods(); for (int i = 0; i < m.length; i++){ System.out.println(‘‘Methode:‘‘+ m[i].getName()); }
Reflection API6 Erzeugen von Objekten Normal: Person p = new PersonBean(); Mit Reflection: Class c = Class.forName(“demo.PersonBean“); Person p = (Person) c.newInstance(); Ermöglicht Zugriff auf Klasse, die während Erstellung der Anwendung unbekannt –jede beliebige Klasse, die Interface Person implementiert –evtl. aus Property-Datei
Reflection API7 Setzen von Werten Normal: p.setFirstName(“Maria“); Mit Reflection: Class c = p.getClass(); Class argDef[] = {String.class}; Method m = c.getMethod(“setFirstName“, argDef); Object arg[] = {“Maria“}; m.invoke(p, arg);
Reflection API8 Java Beans normale Java-Klassen, die Design und Namens- muster folgen (Verarbeitungslogik) parameterloser Konstruktor definieren Properties (Objekteigenschaften) Properties über getter/setter-Methoden abfragen + ändern, d.h. folgen Muster: setXXX()-Methode zum Setzen getXXX-Methode zum Auslesen XXX steht für Namen der Property
Reflection API9 Java-Beans + Reflection Reflection (eigentlich Introspection) angewandt, um Properties der BeanKlasse zur Laufzeit zu ermitteln, auszulesen bzw. neu zu setzen Properties spezifisch für jede Bean-Klasse, folgen aber Muster Anwendung erkennt Properties der Bean-Klasse an diesem Muster und sucht nach setXXX und getXXX
Reflection API10 Zusammenfassung(I) Reflection einzusetzen, wenn: –Klassen zur Laufzeit einzubinden, die zur Compile-Zeit noch nicht bekannt –Schnittstellen der Klassen nicht durch Interfaces oder abstrakte Klassen definiert, sondern Schnitt- stellenkonventionen und -mustern folgen (Java Beans) Fast vollständige Kontrolle über Objekte: –Methodenname und Übergabeparameter in Dateien ablegbar, (äquivalent) Attribute
Reflection API11 Zusammenfassung(II) Hohe Flexibilität Aber: mehrfaches an Quelltext Performanceeinbußen Keine Prüfung des Compilers auf Korrektheit der Datentypen Daher: Reflection API nur einsetzen, wo wirklich erforderlich!!!
Reflection API12 Quellen Programmierung_mit_Java/70.htmlhttp:// Programmierung_mit_Java/70.html htmlhttp:// 35.html Wille, S., Go To Java Server Pages, Addison-Wesley, München, 2001 Holubek, A.: Willkommen im Dungeon, Java Magazin,3/2000, S.20: java-praxis Reflection API
Reflection API13 Lösung der Zusatzaufgabe Properties p = new Properties(); p.setProperty("12", "maus"); test(p); System.out.println(p.getProperty("12")); public static void test(Properties p){ Class c = p.getClass(); Class args[] = {String.class, String.class}; try{ Method m = c.getMethod("setProperty", args); Object a[] = {"12", "Maria"}; m.invoke(p, a); } catch (NoSuchMethodException exc){ exc.printStackTrace(); } catch (IllegalAccessException exc){ exc.printStackTrace(); }catch (InvocationTargetException exc){ exc.printStackTrace(); }