10
05 - Reflection Das Reflection API

Das Reflection API

  • Upload
    avent

  • View
    26

  • Download
    0

Embed Size (px)

DESCRIPTION

Das Reflection API. Ziel. Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt ist, von welcher Klasse diese Objekt erzeugt wurde. Die weiter Verwendung des Objektes hängt aber davon ab, zu welcher Klasse das Objekt gehört. Beispiel: - PowerPoint PPT Presentation

Citation preview

Page 1: Das Reflection API

05 - Reflection

Das Reflection API

Page 2: Das Reflection API

05 - Reflection 2

ZielEs kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt ist, von welcher Klasse diese Objekt erzeugt wurde. Die weiter Verwendung des Objektes hängt aber davon ab, zu welcher Klasse das Objekt gehört.

Beispiel:

•Das Graphikprogramm ist von JComponent abgeleitet, damit es flexibel als Applikation, Applet oder interne Applikation genutzt werden kann.

•Das Graphikprogramm soll ein JMenuBar an die Elternklasse andocken. Es muss also sicher sein, dass das Elternobjekt die Methode setJMenuBar(JMenuBar) kennt.

•Es ist also günstig zu testen ob diese Methode bekannt ist.

•Das kann nicht zur Übersetzungszeit passieren, da dort der wahre Typ des Parameters noch nicht bekannt ist.

Zur Lösung derartiger Probleme existiert das Reflection API.

Page 3: Das Reflection API

05 - Reflection 3

Das Reflection API besteht aus folgenden Klassen:

•java.lang.Class beschreibt Klassen

•java.lang.reflect.Constructor beschreibt einen Konstruktor

•java.lang.reflect.Field beschreibt ein Attribut

•java.lang.reflect.Method beschreibt eine Methode

•java.lang.reflect.Array beschreibt ein Feld von Objekten

•java.lang.reflect.Modifier beschreibt die Modifiziere eines Objectes

Page 4: Das Reflection API

05 - Reflection 4

Die Klasse ClassDie Klasse Class beschreibt Klassen. D.h. für jede Klasse gibt es genau ein Objekt der Klasse Class, die diese reflektiert.

Aus diesem Objekt kann man die vollständige Schnittstellenbeschreibung der Klasse in Erfahrung bringen, sowie auf Konstruktoren, Methoden und Attribute zugreifen.

Es gibt keine Konstruktoren. Objekte der Klasse Class werden mit der Methodepublic Class getClass()der Klasse Object oder mit der Methodepublic static Class forName(String className) erzeugt.

Page 5: Das Reflection API

05 - Reflection 5

Methoden der Klasse Classpublic Constructor[] getConstructors()liefert ein Feld von Constructor-Objekten für alle in der Klasse definierten Konstruktoren

public Class[] getClasses()liefert ein Feld von Class-Objekten für die in der Klasse definierten internen Klassen und Interface

public Field[] getFields()liefert ein Feld von Field-Objekten für alle in der Klasse definierten Attribute

public Method[] getMethods()liefert ein Feld von Method-Objekten für alle in der Klasse definierten Methoden

Page 6: Das Reflection API

05 - Reflection 6

public Constructor getConstructor(Class[] parameterTypes )liefert das Constructor-Objekt bei die vorgegebene Parameterliste passt.

public Field getField(String name)liefert ein Field-Objekte mit dem angegebenen Namen

public Method getMethod(String name, Class[] parameterTypes )liefert ein Method-Objekt für die Methode mit dem angegebenen Namen und passender Parameterliste

Falls die Objekte nicht existieren werden die entsprechenden Ausnahmen NoSuchMethodException bzw. NoSuchFieldException ausgelöst.

Die Methodepublic String getName()liefert den vollständigen Namen der Klasse.

Page 7: Das Reflection API

05 - Reflection 7

BeispielCollection col = new TreeSet();

Class colClass = col.getClass();

System.out.println(colClass.getName());

Liefert die Ausgabe

java.util.TreeSet

Page 8: Das Reflection API

05 - Reflection 8

Die Klasse MethodObjekte der Klasse Method beschreiben Methoden von Klassen.Es gibt keinen Konstruktor. Objekte der Klasse Method werden mit den Methoden getMethods bzw. getMethod der Klasse Class erzeugt.

Page 9: Das Reflection API

05 - Reflection 9

Methoden der Klasse Methodpublic String getName()liefert den Namen der Methode

public Object invoke(Object obj, Object[] args)ruft die Methode des Objektes obj mit den entsprechenden Parametern args auf

Page 10: Das Reflection API

05 - Reflection 1

0

BeispielJMenuBar mb = new JMenuBar();

try

{

Class frc = fr.getClass();

Method met = frc.getMethod("setJMenuBar",

new Class[]{JMenuBar.class});

met.invoke(fr, new Object[]{mb});

}

catch (NoSuchMethodException nsme){}

catch (NullPointerException npe){}

catch (IllegalAccessException iae){}

catch (InvocationTargetException ite){}