Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Reflection API ETIS SS05. Reflection API2 ETIS SS05 - Nadine Fröhlich Gliederung Motivation –Einsatzgebiete –Metaprogrammierung Klasse Class Zugriff auf.

Ähnliche Präsentationen


Präsentation zum Thema: "Reflection API ETIS SS05. Reflection API2 ETIS SS05 - Nadine Fröhlich Gliederung Motivation –Einsatzgebiete –Metaprogrammierung Klasse Class Zugriff auf."—  Präsentation transkript:

1 Reflection API ETIS SS05

2 Reflection API2 ETIS SS05 - Nadine Fröhlich Gliederung Motivation –Einsatzgebiete –Metaprogrammierung Klasse Class Zugriff auf Klassenbestandteile Erzeugen von Objekten Manipulieren von Objekten –Felder setzen –Methodenaufruf Zusammenfassung

3 Reflection API3 ETIS SS05 - Nadine Fröhlich Motivation - Allgemein Bestandteile: –Core Reflection API: java.lang.reflect (seit JDK 1.1) – Klassen: Method, Field, Modifier,... –außerdem: java.lang - Klassen: Object + Class Spiegelt Klassen, Schnittstellen, Objekte in aktueller JVM wider (Metainformationen) –Metainformationen werden automatisch vom Compiler generiert Ermöglicht, dynamisch zur Laufzeit: –Zugriff auf Informationen über Klassen und deren Bestandteile –Teilweise Manipulation dieser Metainformationen

4 Reflection API4 ETIS SS05 - Nadine Fröhlich Motivation – konkrete Möglichkeiten Laden und Instanzieren von Klassen, deren: –Name zur Compilezeit unbekannt –Quellcode nicht vorhanden –Aufbau nicht bekannt ist Informationen zu Klassen: Methoden, Membervariablen, Superklassen, … Informationen zu Interfaces: Methoden, Konstanten Methodenaufruf + Setzen von Membervariablen, deren Name erst zur Laufzeit bekannt Arrays kreieren, deren Größe + Komponententyp zur Laufzeit nicht bekannt + Veränderung der Komponenten …

5 Reflection API5 ETIS SS05 - Nadine Fröhlich Einsatzgebiete JavaBeans –Properties ermitteln (anhand der get- und set-Methoden) –Werte der Properties auslesen + setzen JUnit –Test-Methoden ermitteln und ausführen (Vorsilbe test) JDBC –Treiber anhand seines Namens laden Objekt-Relationale-Mapper, Serialisierung, Debugger, GUI-Builder, Class-Browser, Plugins, …

6 Reflection API6 ETIS SS05 - Nadine Fröhlich Metaprogrammierung Reflection ist eine (abgeschwächte) Form der Metaprogrammierung normal: -Programm kennt Daten, aber nicht sich selbst Metaprogrammierung: -Programme als Daten -Programm hat Zugriff auf sich selbst -Programm liegt in selber Präsentation wie Daten vor

7 Reflection API7 ETIS SS05 - Nadine Fröhlich 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(java.awt.Button);

8 Reflection API8 ETIS SS05 - Nadine Fröhlich Zugriff auf Klassenbestandteile I für dynamischen Zugriff auf Klassenbestandteile Klassen: Constructor, Method und Field Instanzen dieser Klassen mit Methoden der Klasse Class erzeugt –Field fields [] = c.getFields(); –Field fields [] = c.getDeclaredFields(); –Field field = c.getField(name); Hinweis: mit erhaltenen Field-Objekten sind mehrere Instanzen bearbeitbar (d.h. beim Setzen der Felder ist das betroffene Objekt mit anzugeben)Setzen der Felder

9 Reflection API9 ETIS SS05 - Nadine Fröhlich Zugriff auf Klassenbestandteile II Ermittlung der Methoden einer Klasse: Method m[] = c.getMethods(); Method m[] = c.DeclaredMethods(); Class param[] = new Class[] {Object.class} Method m = c.getMethod(add, param) Weiterhin ermittelbar: – Interfaces, Superklassen – Packagename, Name der Klasse – Modifier (z.B. public, final) – ob eine Datentyp primitiv ist

10 Reflection API10 ETIS SS05 - Nadine Fröhlich Erzeugen von Objekten Normal: –Person p = new PersonBean(); Mit Reflection: –Class c = Class.forName(demo.PersonBean); –Person p = (Person) c.newInstance(); Vorgehen ermöglicht Zugriff auf Klasse, die während Erstellung der Anwendung unbekannt ist. Im obigen Beispiel Zugriff auf: –jede beliebige Klasse, die Interface Person implementiert + –evtl. aus Properties-Datei stammt

11 Reflection API11 ETIS SS05 - Nadine Fröhlich Felder setzen Normal: –p.pname = Lisa; Mit Reflection: –Class c = p.getClass(); –Field name = c.getDeclaredField(pname); –name.set(p, Lisa);

12 Reflection API12 ETIS SS05 - Nadine Fröhlich Methodenaufruf Normal: p.setFirstName(Maria); Mit Reflection: Class c = p.getClass(); //Parametertypen setzen Class argDef[] = {String.class}; Method m = c.getMethod(setFirstName, argDef); //Parameterwerte setzen Object arg[] = {Maria}; m.invoke(p, arg);

13 Reflection API13 ETIS SS05 - Nadine Fröhlich Zusammenfassung Reflection einzusetzen, wenn hohe Flexibilität gefordert: –Klassen zur Laufzeit einzubinden, die zur Compile-Zeit noch unbekannt sind –Klassen-Schnittstellen nicht durch Interfaces oder abstrakte Klassen definiert, sondern Schnittstellenkonventionen und -mustern folgen (wie Java Beans) Fast vollständige Kontrolle über Objekte möglich: –Methodenname, Parameter, Attribute, Klassennamen in Dateien ablegbar Aber: –z.T. etwas geringere Performance –Keine Prüfung des Compilers auf Korrektheit der Datentypen Daher: –Reflection API nur einsetzen, wo wirklich erforderlich

14 Reflection API14 ETIS SS05 - Nadine Fröhlich Quellen mmierung_mit_Java/70.htmlhttp://www.dpunkt.de/java/Die_Sprache_Java/Objektorientierte_Progra mmierung_mit_Java/70.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 Wutka, M., J2EE Developer s Guide, Markt+Technik, München, 2002 diese Dokumente existieren nicht mehr im Netz...

15 Reflection API15 ETIS SS05 - Nadine Fröhlich 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(setXXX und getXXX) Introspection basiert auf Reflection, aber höhere Sicht – wichtige Methoden: –java.beans.Introspector –java.beans.PropertyDescriptor


Herunterladen ppt "Reflection API ETIS SS05. Reflection API2 ETIS SS05 - Nadine Fröhlich Gliederung Motivation –Einsatzgebiete –Metaprogrammierung Klasse Class Zugriff auf."

Ähnliche Präsentationen


Google-Anzeigen