130 likes | 253 Vues
The Java Reflection API, introduced in JDK 1.1, enables dynamic class loading and instantiation without compile-time knowledge of class names. This powerful feature allows developers to invoke methods, access member variables, and utilize metainformation about classes. It's essential for creating frameworks, debugging, GUI builders, and beans serialization. Through various classes like Class, Method, and Field, developers can create and manipulate objects at runtime while maintaining flexibility despite potential drawbacks in performance and type safety. Use the Reflection API judiciously when necessary.
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