Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Reflection API1 Motivation Reflection API Core Reflection API: java.lang.reflect Seit JDK 1.1 integraler Bestandteil der Java- Klassenbibliothek Ermöglicht:

Ähnliche Präsentationen


Präsentation zum Thema: "Reflection API1 Motivation Reflection API Core Reflection API: java.lang.reflect Seit JDK 1.1 integraler Bestandteil der Java- Klassenbibliothek Ermöglicht:"—  Präsentation transkript:

1 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

2 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

3 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);

4 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

5 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()); }

6 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

7 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);

8 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

9 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

10 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

11 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!!!

12 Reflection API12 Quellen http://www.dpunkt.de/java/Die_Sprache_Java/Objektorientierte_ Programmierung_mit_Java/70.htmlhttp://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/node 35.htmlhttp://www.ifs.tuwien.ac.at/~mbach/misc/JavaVsSmallTalk/node 35.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

13 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(); }


Herunterladen ppt "Reflection API1 Motivation Reflection API Core Reflection API: java.lang.reflect Seit JDK 1.1 integraler Bestandteil der Java- Klassenbibliothek Ermöglicht:"

Ähnliche Präsentationen


Google-Anzeigen