„Reflection (Programmierung)“ – Versionsunterschied
[ungesichtete Version] | [ungesichtete Version] |
→Java Beispiel: -static, + javadoc |
Jpp (Diskussion | Beiträge) →Java Beispiel: Beispiel stilistisch überarbeitet und vereinfacht |
||
Zeile 11: | Zeile 11: | ||
Eine wichtige Rolle spielt die Verwendung von Reflexion bei der [[Aspektorientierte Programmierung|aspektorientierten Programmierung]], im Zusammenhang mit [[Generizität]] (d. h. der typsicheren Programmierung), aber auch in Fragen der [[Persistenz]] (persistente Datenhaltung von [[Objekt]]en und deren [[Beziehung]]en). |
Eine wichtige Rolle spielt die Verwendung von Reflexion bei der [[Aspektorientierte Programmierung|aspektorientierten Programmierung]], im Zusammenhang mit [[Generizität]] (d. h. der typsicheren Programmierung), aber auch in Fragen der [[Persistenz]] (persistente Datenhaltung von [[Objekt]]en und deren [[Beziehung]]en). |
||
== |
==[[Java]]-Beispiel== |
||
Das folgende Beispiel zeigt eine Methode, die eine beliebige Methode eines gegebenen Objekts aufruft und deren Rückgabewert zurück gibt. Aus Gründen der Vereinfachung unterstützt dieses Beispiel nur den Aufruf von Methoden ohne Parameter, die Strings zurück geben. Außerdem werden die vielfältigen möglichen Fehlersituationen ([[Exception]]s) nicht ausgewertet sondern in einem einfachen <code>try-catch</code>-Block zusammengefasst. |
|||
Zugriff auf eine [[Java_Beans|Bean]] die in einem HttpServletRequest liegt: |
|||
⚫ | |||
/** |
|||
⚫ | |||
* Gibt den Inhalt einer Bean Methode zurück |
|||
⚫ | |||
* @param name Name der Bean im request |
|||
Method getter = |
|||
* @param property Methoden Name der Bean |
|||
object.getClass().getMethod(methodname, new Class[0]); |
|||
* @return Return-Wert der Bean Methode oder null, wenn nich existent |
|||
⚫ | |||
*/ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
Object bean = request.getAttribute(name); |
|||
return value; |
|||
Method getter = bean.getClass().getMethod(property, new Class[0] /* parameter-klassen, hier keine parameter */); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
return (value==null?null:value.toString()); |
|||
} |
} |
||
Der folgende Aufruf von <code>getString</code> würde dann die Methode <code>getVorname()</code> des Objekts <code>person</code> aufrufen und deren Rückgabewert ausgeben. |
|||
Aufruf-Beispiel: |
|||
System.out.println( |
System.out.println("Vorname von " + person + " ist " + getStringProperty(person, "getVorname")); |
||
==Siehe auch== |
==Siehe auch== |
Version vom 19. Januar 2005, 10:12 Uhr
In der objektorientierten Programmierung (OOP) spricht man von Reflexion (engl. reflection), wenn zur Laufzeit eines Programmes Informationen über Eigenschaften von Typen und deren Mitgliedern (engl. member) gesammelt werden.
Ein Typ (engl. type) ist dabei i. d. R. eine Klasse (engl. class), die wiederum verschiedene Mitglieder (Attribute, Eigenschaften, Methoden, Schnittstellen) besitzen, die ihrerseits über Eigenschaften verfügen können.
Reflexion ermöglicht es nun, zur Laufzeit Informationen über Klassen oder deren Instanzen abfragen zu können. Bei einer Methode sind das u. a. deren Sichtbarkeit, die Art des Rückgabewertes oder die Art der Übergabeparameter. Die Umsetzung ist dabei sprachspezifisch realisiert.
Hochsprachen wie Java (java.lang.reflect) oder die Sprache C# (System.Reflection) des .NET-Frameworks bieten dazu entsprechende Pakete (engl. package) bzw. Namensräume (engl. namespace) an.
Eine wichtige Rolle spielt die Verwendung von Reflexion bei der aspektorientierten Programmierung, im Zusammenhang mit Generizität (d. h. der typsicheren Programmierung), aber auch in Fragen der Persistenz (persistente Datenhaltung von Objekten und deren Beziehungen).
Java-Beispiel
Das folgende Beispiel zeigt eine Methode, die eine beliebige Methode eines gegebenen Objekts aufruft und deren Rückgabewert zurück gibt. Aus Gründen der Vereinfachung unterstützt dieses Beispiel nur den Aufruf von Methoden ohne Parameter, die Strings zurück geben. Außerdem werden die vielfältigen möglichen Fehlersituationen (Exceptions) nicht ausgewertet sondern in einem einfachen try-catch
-Block zusammengefasst.
public String getStringProperty(Object object, String methodname) { String value; try { Method getter = object.getClass().getMethod(methodname, new Class[0]); value = (String) getter.invoke(object, new Object[0]); } catch (Exception e) { e.printStackTrace(); value = null; } return value; }
Der folgende Aufruf von getString
würde dann die Methode getVorname()
des Objekts person
aufrufen und deren Rückgabewert ausgeben.
System.out.println("Vorname von " + person + " ist " + getStringProperty(person, "getVorname"));
Siehe auch
Objektorientierte Programmierung, Aspektorientierte Programmierung