Java Reflection. Andreas Lochbihler. 15. Mai Lehrstuhl Programmierparadigmen Universität Karlsruhe

Ähnliche Dokumente
Meta Programming and Reflection in Java

Info B VL 14: Java Collections/Reflections

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

Leseprobe. Rainer Oechsle. Java-Komponenten. Grundlagen, prototypische Realisierung und Beispiele für Komponentensysteme

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

Properties und Proxies

Universität Karlsruhe (TH)

II.4.4 Exceptions - 1 -

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Instrumentierung und Dekodierung

Reflection. Programmieren 2 - H.Neuendorf (131)

Überblick. Stubs & Skeletons Java Reflection API Dynamische Proxies als Stubs Generische Skeletons Aufgabe 2. VS-Übung (SS17) Stubs & Skeletons 2 1

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Objektorientierte Programmierung Studiengang Medieninformatik

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Spracherweiterungen in Java 5

II.4.4 Exceptions - 1 -

Deadlocks Wait/Notify Reflections JavaBeans. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 33

Info B VL 11: Innere Klassen/Collections

Programmieren II. Verklemmungen. Vorlesung 10. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Deadlocks.

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Verteilte Systeme Übung

Annotation in Java 1.5

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Überblick. Class-Objekte. Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen

Überblick. Beispiel: get()-methodenaufruf am VSBoard aus Übungsaufgabe 1. Analyse einer Methode: java.lang.reflect.method

Algorithmen und Datenstrukturen

14 Abstrakte Klassen, finale Klassen, Interfaces

SmallTalk - Eine kurze Einführung

Überblick. Java Reflection API. Class-Objekte

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

9. Ausnahmebehandlung

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Prinzip des Exception Handling

12 Abstrakte Klassen, finale Klassen und Interfaces

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Java-Schulung Grundlagen

Objektorientierung (OO)

Java Remote Method Invocation (RMI)

Algorithmen und Programmierung III

Javakurs zu Informatik I. Henning Heitkötter

spectj AOP mit Java, Konzepte und Beispiele

Reflection. Laufzeit-Typinformationen. Objekterzeugung, Methodenaufrufe. Dynamic Proxy. Annotations. M. Löberbauer, T. Kotzmann, H.

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Javakurs für Anfänger

Remote Method Invocation

Übung 1: Object Inspector

M3 M4 M7 VORNAME: Gewinnt VERTIEFUNG:

1 Klassen und Objekte

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

9. Ausnahmebehandlung

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Master of Advanced Studies in Software Engineering Java - Advanced Concepts. Musteraufgaben

Kurzanleitung RMI-Beispiel: gettime Seite 1 / 7. RMI Projekt gettime 1

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Programmierung für Mathematik HS11

Informatik II Übung 02. Benjamin Hepp 8 March 2017

Java-Programmierung. Remote Method Invocation - RMI

Interface. So werden Interfaces gemacht

Java - Programmierung - Objektorientierte Programmierung 1

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Algorithmen und Programmierung III

13. Java Klassen. Lernziele. Klassen - Technisch. Definition: Klassen

Programmieren in Java

Teil 3 - Java. Grundlagen Klassen, Attribute Methoden

Java Einführung Klassendefinitionen

Wo sind wir? Rudolf Berrendorf FH Bonn-Rhein-Sieg Programmiersprache Java 280

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Algorithmen und Datenstrukturen 07

Abschnitt 7: Weitere Konzepte der oo Programmierung in Java

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/ / 854

II.4.5 Generische Datentypen - 1 -

Die abstrakte Klasse Expression:

Überblick. Verteilte Systeme Übung. VS-Übung. Dynamische Proxies Stubs & Skeletons Dynamische Proxies als Stubs. Tobias Distler, Michael Gernoth

Reflection. Programmieren 2 - H.Neuendorf (131)

5.2 Input/Output mit Dateien

Themen. Web Service - Clients. Kommunikation zw. Web Services

Ausnahmen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 27.6.

Einführung in die Programmierung mit Java

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Vorkurs Informatik WiSe 15/16

AuD-Tafelübung T-B5b

Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Marshalling & Unmarshalling

Abschnitt 10: Typisierte Klassen

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

Stack stack = new Stack(); stack.push ("Würstchen"); string s = (string) stack.pop(); Console.WriteLine (s);

Java 8. basierend auf Folien von Florian Erhard

Transkript:

Java Reflection Andreas Lochbihler Lehrstuhl Programmierparadigmen Universität Karlsruhe 15. Mai 2008

Was ist Reflection? Ein Paket (package) von Interfaces und Klassen, die dem Programm zur Laufzeit Zugriff auf geladene Klassen, deren Felder und Methoden (= reflektive Informationen) ermöglichen bis hin zur Manipulation der entsprechenden Objekte unter Wahrung oder Umgehung der Sichtbarkeitseinschränkungen.

Was bietet Reflection? Informationen über Klassen, Methoden und Felder Erzeugen von Objekten und Arrays mit dynamischen Typen Dynamische Methodenaufrufe Auslesen und Beschreiben von Felder Abschalten von Zugriffsbeschränkungen Auslesen der Annotations

Wozu kann man Reflection verwenden? Alle Arten von Programmier-Tools: Debugger Interpreter Object Inspector Class Browser Testtools Object Serialisation Java Beans Dynamisches Laden von Code

Beispiel: Java Beans Auszug aus einer graphischen Kompontente: class SampleBean {... public void setbackground(color c) {... public Color getbackground() {... public void setforeground(color c) {... public Color getbackground() {...... Reflection kann: Die beiden Properties Background und Foreground durch Abfrage aller Methoden ermitteln (Namenskonventionen). Einen Editor erstellen, der es möglich macht, die Kompontente live zu ändern. Eine Abhängigkeit von SampleBean ist nicht nötig

Reflection API: java.lang.class<t> Für jede Klasse existiert zur Laufzeit ein Objekt des Typs Class. T ist der Typ der Klasse. Wichtigste Methoden dieser Klasse: static Class<?> forname(string classname) T newinstance() Field[] getdeclaredfields() Method[] getdeclaredmethods() Method[] getmethods() Method getmethod(string name, Class<?>... parametertypes)

Reflection API Auch für Methoden und Felder existieren Klassen bzw. Objekte: java.lang.reflect.method Class<?>[] getparametertypes() Class<?> getreturntype() Object invoke(object obj, Object... args) java.lang.reflect.field Object get(object obj) void set(object obj, Object value) Class<?> gettype() int getint(object obj) Analog für Konstruktoren: java.lang.reflect.constructor<t>

Beispiel: Zeitmessung class Timer { static public void main(string[] args) throws... { Class c = Class.forName(args[0]); Method m = c.getmethod("main", String[].class); Object[] args2 = new String[args.length - 1]; System.arraycopy(args, 1, args2, 0, args2.length); long start = System.currentTimeMillis(); m.invoke(null, args2); long end = System.currentTimeMillis(); System.err.println("execution took " + (end - start) + "ms");

Beispiel: Zeitmessung (2) > java Add 2 3 5 > java Time Add 2 3 5 Running Add took 23ms >

Reflection API: java.lang.reflect.accessibleobject Oberklasse von allen Klassen, die zugriffsbeschränkte Eigenschaften repräsentieren (Method, Field). public static void setaccessible (AccessibleObject[] array, boolean flag) throws SecurityException; public void setaccessible (boolean flag) throws SecurityException; SecurityException wird bei installiertem SecurityManager und fehlenden Privilegien geworfen. Ohne solche Hintertüren ist z.b. Serialisierung unmöglich.

Beispiel: Zugriff auf private Members class Superhero { public final String name; private final String secretid; public Superhero(String name, String secretid) { this.name = name; this.secretid = secretid; class Reporter { public static void main(string[] args) throws... { Superhero s = new Superhero("Batman", "Bruce Wayne"); hackidentity(s);

Beispiel: Zugriff auf private Members (2) static void hackidentity(superhero s) throws... { Field secret = Superhero.class. getdeclaredfield("secretidentity"); secret.setaccessible(true); System.out.println("Identity is " + secret.get(s)); secret.set(s, "Clark Kent"); System.out.println("Identity is now " + secret.get(s)); > java Reporter Identity is Bruce Wayne Identity is now Clark Kent

Warum ist Class generisch? Mit Typ-Parametern können keine Objekte erzeugt werden: class Factory<T> {... void produce() { return new T(); // Compiler-Fehler Mit Reflection kann das Problem gelöst werden: static <T> T factory(class<t> c, String param) { T result = c.newinstance();... return result; factory(person.class, "Andreas Lochbihler");

Praxis: Anwendung von Reflection Eclipse: Entwicklungsumgebung Plugins werden über Reflection geladen und gestartet KAWA: Scheme-Interpreter Aufruf von Java-Methoden Java-API RMI / CORBA Auswahl des Swing Look and Feels Exception-Handling beim Event-Dispatch

Reflection und Annotations: generische Testklasse import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { public class Foo { @Test public static void m() {... public static void m2() {... @Test public static void m3() { throw new RuntimeException("Error");

Reflection und Annotations: generische Testklasse (2) import java.lang.reflect.*; public class RunTestMethods { public static void main(string[] args) throws... { for (Method m : Class.forName(args[0]).getMethods()) if (m.isannotationpresent(test.class)) { try { m.invoke(null); catch (... e) {...

Zusammenfassung Reflection bietet zahlreiche Informationen über die Struktur eines laufenden Programms Beschränkte Manipulation von Objekten möglich Benutzung der API ist bisweilen sperrig (Exceptions, primitive Typen) Für bestimmte Anwendungen oft die einzige Alternative zu nativem Code