1 / 13

Motivation Reflection API

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

tanith
Download Presentation

Motivation Reflection API

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

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

  12. 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

  13. 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

More Related