130 likes | 242 Views
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
E N D
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 API
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 API
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 API
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 API
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 API
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 API
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 API
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 API
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 API
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 API
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 API
Quellen • http://www.dpunkt.de/java/Die_Sprache_Java/Objektorientierte_Programmierung_mit_Java/70.html • http://www.rz.fhtw-berlin.de/hjp3/k100268.html#kapitelreflection • http://www.ifs.tuwien.ac.at/~mbach/misc/JavaVsSmallTalk/node35.html • http://www.jeckle.de/vorlesung/java/kap3.html#reflectionAPI • http://java.sun.com/docs/books/tutorial/reflect/ • 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 API
Lösung der Zusatzaufgabe • Properties p = new Properties(); • p.setProperty("12", "maus"); • test(p); • System.out.println(p.getProperty("12")); • publicstaticvoidtest(Propertiesp){ • Classc=p.getClass(); • Classargs[]={String.class,String.class}; • try{ • Methodm=c.getMethod("setProperty",args); • Objecta[]={"12","Maria"}; • m.invoke(p,a); • }catch(NoSuchMethodExceptionexc){ • exc.printStackTrace(); • }catch(IllegalAccessExceptionexc){ • exc.printStackTrace(); • }catch(InvocationTargetExceptionexc){ • exc.printStackTrace(); • } Reflection API