Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Ähnliche Dokumente
Themen. Web Service - Clients. Kommunikation zw. Web Services

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Typumwandlungen bei Referenztypen

Einführung in die Programmierung

Algorithmen und Datenstrukturen

Meta Programming and Reflection in Java

Große Übung Praktische Informatik 1

Der lokale und verteilte Fall

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Javakurs zu Informatik I. Henning Heitkötter

Objektorientierte Programmierung

Programmieren in Java

Factory Method (Virtual Constructor)

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

3 Objektorientierte Konzepte in Java

Einführung in die Java- Programmierung

WebService in Java SE und EE

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Auszug aus JAX-WS Folien

Java: Vererbung. Teil 3: super()

Application Frameworks

WPF Steuerelemente Listbox, ComboBox, ListView,

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Gebundene Typparameter

Prinzipien Objektorientierter Programmierung

Testen mit JUnit. Motivation

Objektorientierte Programmierung. Kapitel 12: Interfaces

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Remote Method Invocation

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Architektur des agimatec-validation Frameworks

Programmierkurs Java

Programmieren I. Kapitel 15. Ein und Ausgabe

Java Einführung Abstrakte Klassen und Interfaces

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Applet Firewall und Freigabe der Objekte

Vererbung & Schnittstellen in C#

Zählen von Objekten einer bestimmten Klasse

Höhere Programmierkonzepte Testklausur

Delegatesund Ereignisse

Java RMI Remote Method Invocation

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

JDBC. Allgemeines ODBC. java.sql. Beispiele

VS Praktikum 03 Konzept

Software Engineering Klassendiagramme Einführung

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Assoziation und Aggregation

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Innere Klassen in Java

Einführung in die Programmierung Blockkurs Java

2. Semester, 2. Prüfung, Lösung

Objektorientierte Programmierung

Java Einführung Collections

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Objektorientierung: Klassen und Objekte

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Liste Programmieren Java Überblick

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Studentische Lösung zum Übungsblatt Nr. 7

Java-Programmierung. Remote Method Invocation - RMI

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Java Einführung Packages

Klassenbeziehungen & Vererbung

3 Objektorientierte Konzepte in Java

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

4. AuD Tafelübung T-C3

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Mobile und Verteilte Datenbanken

Grundkonstrukte der Objektorientierung in Java, C# und C++

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Javakurs 2013 Objektorientierung

Gregor Raschke 2008 HIBERNATE. Eine Einführung

1 Polymorphie (Vielgestaltigkeit)

Java Einführung Methoden in Klassen

Übung: Verwendung von Java-Threads

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Testklausur 1 zur Vorlesung. Modellierung und Programmierung I. Dr. Monika Meiler Zeit: 60 Minuten

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

5. Tutorium zu Programmieren

Computeranwendung und Programmierung (CuP)

Probeklausur: Programmierung WS04/05

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Transkript:

Java Reflection Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Java Reflection Die Java Reflection API liefert per Introspection Informationen über Klassen => Meta-Daten. Zu jedem Java Objekt x vom Typ X gehört ein Class- Objekt X als Instanz der Klasse Class<X>. Das Class Objekt X ist die Blaupause für alle Operationen die x ausführen kann, liefert Informationen über alle Annotationen, Parameterisierungen und alle Felder von x. Reflection erlaubt schreibenden und lesenden Zugriff auf Felder von x und kann Methoden von x ausführen. Besonders Codegeneratoren verwenden Reflection. Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 2

Java Reflection API this.getclass() Object Class name : 1 Package MyClass myattribute mymethod() <<Interface>> Member Constructor (from Field (from Method (from Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 3

Meta-Informationen Typische Meta-Informationen zu einem Objekt x sind: isannotation: ist x eine Annotation? isenum: ist x ein Aufzählungstyp? isprimitive: ist der Typ von x ein Java Primitive? isinterface: ist x eine Schnittstelle? getname: wie heißt die Klasse von x? isarray: handelt es sich bei x um ein Feld? public static void introspect(object x) { Class<?> X = x.getclass(); out.printf("getname %s \n",x.getname()); out.printf("isarray %b \n",x.isarray()); Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 4

Felder und Methoden Neben den reinen Informationen ist auch der Zugriff auf Methoden oder Felder vom Objekt x möglich: getannotation(s): liefert (alle) Annotationen von x. getmethod(s): liefert (alle) Methoden von x. getfield(s): liefert (alle) Felder/Attribute von x. public static void introspect(object x) throws Exception { Class<?> X = x.getclass(); Method m = X.getMethod("toString", new Class<?>[0]); out.printf("method: x.tostring %s \n",m); Field f = X.getField("myField"); out.printf("field: x.myfield %s \n",f); Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 5

Manipulationen Felder von x lassen sich Auslesen und Verändern. Field f = X.getDeclaredField("myField"); out.printf("field: x.myfield %s \n",f); f.set(x,"another Value"); out.printf("field: x.myfield %s \n",f.get(x)); Methoden von x lassen sich ausführen. List<Integer> list =... Method m = X.getMethod("sort", List.class); m.invoke(x, list); Entspricht: x.sort(list); Die Instanz x muss übergeben werden Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 6

Fabrik Methoden Das Class Objekt liefert neben den Methoden als Meta-Informationen auch die Konstruktoren, die es gestatten neue Objekte vom Typ X zu erzeugen. Entweder mit Bean Konstruktor ohne Argumente: Class<?> X = x.getclass(); Object z = X.newInstance(); out.printf("new Object %s\n",z); assert(z.getclass() == x.getclass()); oder mit Argumenten: Object[] args =... Constructor<?>[] ctors = X.getConstructors(); Object y = ctors[0].newinstance(args); out.printf("new Object %s\n",y); Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 7

Class Objekte Ein spezifisches Class Objekt lässt sich auch ohne ein konkretes Objekt x zur Laufzeit erstellen, sofern der vollqualifizierte Name von X bekannt ist. Die statische Methode forname liefert eine Class Instanz passend zum übergebenen Namen: Class<?> clazz = Class.forName("java.lang.Thread"); Object o = clazz.newinstance(); System.out.println("Object " + o); Thread t = (Thread) o; t.start(); Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 8

Code-Generatoren Code-Generatoren können zur Laufzeit eigenen Byte- Code generieren, diesen vom ClassLoader überprüfen lassen und dann Instanzen erzeugen. class Generator extends ClassLoader { public Class<?> createclass(string classname,byte[] code) { return defineclass(classname,code,0,code.length); void loaderexample() throws InstantiationException, IllegalAccessEx Generator loader = new Generator(); byte[] generated =... // a miracle generates byte-code String classname = "XYZ"; Class<?> genclazz = loader.createclass(classname, generated); Object instance = genclazz.newinstance(); out.printf("generated Object %s\n",instance); Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 9

ASM Byte-Code Bibliothek Byte-Code kann z.b. mit Hilfe der ASM Bibliothek zur Laufzeit erstellt werden. ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); TraceClassVisitor cv = new TraceClassVisitor(cw, new PrintWriter(System.out)); cv.visit(v1_5,acc_public+acc_super,"test/test",signature,"java/lang/object",interfaces); cv.visitfield(acc_private, "x", "I", signature, null).visitend();... MethodVisitor mv = cv.visitmethod(acc_public, "getx", "()I", signature, exceptions); mv.visitcode(); mv.visitvarinsn(aload, 0); mv.visitfieldinsn(getfield,"test/test", "x", "I"); mv.visitinsn(ireturn); mv.visitmaxs(1,1); mv.visitend();... cv.visitend(); byte[] generated = cw.tobytearray(); Generator generator = new Generator(); Class<?> clazz = generator.createclass("test/test",generated); System.out.println("clazz: " + clazz); Object instance = clazz.newinstance(); // access flags 0x1 public getx()i ALOAD 0 GETFIELD test/test.x : I IRETURN public int getx() { return x; Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 10

java.lang.reflection.proxy Reflection wurde z.b. zur Generierung von Proxies beim RessourcePool<X> eingesetzt (X ist ein Interface): protected X createproxy(x x) { Class<?> clazz = x.getclass(); X proxy = (X) java.lang.reflect.proxy.newproxyinstance( clazz.getclassloader(), clazz.getinterfaces(), new ResourceHandle(x)); return proxy; class ResourceHandle implements java.lang.reflect.invocationhandle private X x; public Object invoke(object proxy, Method m, Object[] args) throws Throwable { checkaccess(); return m.invoke(x, args); Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 11

Zusammenfassung Ausgehend vom Class Objekt lassen sich alle Felder und Methoden einer Klasse abfragen. Die Reflection API erlaubt die Analyse, Manipulation und Erzeugung von beliebigen Objekten. Mit Hilfe von Byte-Code Generatoren lassen sich neue Klassen, wie Proxies oder Adapter zur Laufzeit durch Übergabe des Byte-Code an den ClassLoader erzeugen. Der Java SecurityManager kann die Verwendung der Reflection API einschränken. Prof. Dr. Nikolaus Wulff Höhere Programmierkonzepte 12