• Keine Ergebnisse gefunden

Java Reflection

N/A
N/A
Protected

Academic year: 2022

Aktie "Java Reflection"

Copied!
17
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Java Reflection

Andreas Lochbihler

Lehrstuhl Programmierparadigmen Universit¨at Karlsruhe

15. Mai 2008

(2)

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¨ oglichen

bis hin zur Manipulation der entsprechenden Objekte unter

Wahrung oder Umgehung der Sichtbarkeitseinschr¨ ankungen.

(3)

Was bietet Reflection?

I

Informationen ¨ uber Klassen, Methoden und Felder

I

Erzeugen von Objekten und Arrays mit dynamischen Typen

I

Dynamische Methodenaufrufe

I

Auslesen und Beschreiben von Felder

I

Abschalten von Zugriffsbeschr¨ ankungen

I

Auslesen der Annotations

(4)

Wozu kann man Reflection verwenden?

I

Alle Arten von Programmier-Tools:

I Debugger

I Interpreter

I Object Inspector

I Class Browser

I Testtools

I

Object Serialisation

I

Java Beans

I

Dynamisches Laden von Code

(5)

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:

I

Die beiden Properties

Background

und

Foreground

durch Abfrage aller Methoden ermitteln (Namenskonventionen).

I

Einen Editor erstellen, der es m¨ oglich macht, die Kompontente live zu ¨ andern.

I

Eine Abh¨ angigkeit von

SampleBean

ist nicht n¨ otig

(6)

Reflection API:

java.lang.Class<T>

F¨ ur jede Klasse existiert zur Laufzeit ein Objekt des Typs

Class

.

T

ist der Typ der Klasse.

Wichtigste Methoden dieser Klasse:

I static Class<?> forName(String className)

I T newInstance()

I Field[] getDeclaredFields()

I Method[] getDeclaredMethods()

I Method[] getMethods()

I Method getMethod(String name,

Class<?>... parameterTypes)

(7)

Reflection API

Auch f¨ ur Methoden und Felder existieren Klassen bzw. Objekte:

I java.lang.reflect.Method

I Class<?>[] getParameterTypes()

I Class<?> getReturnType()

I Object invoke(Object obj, Object... args)

I java.lang.reflect.Field

I Object get(Object obj)

I void set(Object obj, Object value)

I Class<?> getType()

I int getInt(Object obj)

Analog f¨ ur Konstruktoren:

java.lang.reflect.Constructor<T>

(8)

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

} }

(9)

Beispiel: Zeitmessung (2)

> java Add 2 3 5

> java Time Add 2 3 5

Running ’Add’ took 23ms

>

(10)

Reflection API:

java.lang.reflect.AccessibleObject

Oberklasse von allen Klassen, die zugriffsbeschr¨ ankte Eigenschaften repr¨ asentieren (

Method

,

Field

).

I public static void setAccessible

(AccessibleObject[] array, boolean flag) throws SecurityException;

I public void setAccessible (boolean flag) throws SecurityException;

SecurityException

wird bei installiertem

SecurityManager

und fehlenden Privilegien geworfen.

Ohne solche Hintert¨ uren ist z.B. Serialisierung unm¨ oglich.

(11)

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

}

(12)

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

(13)

Warum ist

Class

generisch?

Mit Typ-Parametern k¨ onnen keine Objekte erzeugt werden:

class Factory<T> { ...

void produce() {

return new T(); // Compiler-Fehler }

}

Mit Reflection kann das Problem gel¨ ost werden:

static <T> T factory(Class<T> c, String param) { T result = c.newInstance();

...

return result;

}

factory(Person.class, "Andreas Lochbihler");

(14)

Praxis: Anwendung von Reflection

I

Eclipse : Entwicklungsumgebung

I Plugins werden ¨uber Reflection geladen und gestartet

I

KAWA: Scheme-Interpreter

I Aufruf von Java-Methoden

I

Java-API

I RMI / CORBA

I Auswahl des Swing Look and Feels

I Exception-Handling beim Event-Dispatch

(15)

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

} }

(16)

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) { ... } }

} }

(17)

Zusammenfassung

I

Reflection bietet zahlreiche Informationen ¨ uber die Struktur eines laufenden Programms

I

Beschr¨ ankte Manipulation von Objekten m¨ oglich

I

Benutzung der API ist bisweilen sperrig (Exceptions, primitive Typen)

I

F¨ ur bestimmte Anwendungen oft die einzige Alternative zu

nativem Code

Referenzen

ÄHNLICHE DOKUMENTE

Wenn wir zum Beispiel Klassen wie „Triangle“ und „Arrow“ haben, dann können beide Klassen als Spezialisierung einer Klasse „Shape“ angesehen werden.. Methoden, die in

Wenn in einer &#34;Klasse&#34; KEINE Methode implementiert ist, wird sie als interface &#34;Schnittstelle&#34; bezeichnet. public interface

• Eine Klasse kann ein Interface auch dann implementieren, wenn sie nicht alle seine Methoden implementiert. • Die Klasse ist dann als abstrakte Klasse

(z.B. Quadrat) Lage, Position, Größe, Strichstärke, Strichfarbe, Füllfarbe, Füllmuster,

Schreiben Sie ein Java-Programm, das eine beliebige Anzahl von double –Werten einliest und so in ein Feld abspeichert, dass gleiche Werte hintereinander angeordnet sind und

Instanzdaten können durch eine gewöhnliche Initialisie- rung, durch einen Konstruktor oder einen Initialisierer initialisiert werden. Instanzdaten werden automatisch mit

● Um mit einer Datenbank zu kommunizieren bedarf es eines Jdbc Drivers, der die Klasse driver.class implementiert.. ● Der jdbc-Driver enthält

Beim Beenden des Servers getServletInfo Liefert Info zu Servlet. Methoden