Das Fotonexus-Wiki befindet sich im Testbetrieb.
Reflexion (Programmierung)
Aus Fotonexus.
In der Programmierung bedeutet Reflexion (engl. reflection) bzw. Introspektion, dass ein Programm Erkenntnisse über seine eigene Struktur gewinnen kann.
Eine wichtige Rolle spielt Reflexion im Zusammenhang mit typensicherer Programmierung, aber auch in Fragen der Persistenz (persistente Datenhaltung von Objekten und deren Beziehungen).
Reflexion ermöglicht es bei objektorientierter Programmierung beispielsweise, zur Laufzeit Informationen über Klassen oder deren Instanzen abfragen zu können. Bei einer Methode sind das unter anderem deren Sichtbarkeit, der Datentyp des Rückgabewertes oder der Typ der Übergabeparameter. Die Umsetzung der Abfragemöglichkeiten ist sprachspezifisch.
Für die Realisierung der Reflexion ist das Speichern von Metainformation im Binärcode des Programms notwendig. Bei interpretierten Programmiersprachen liegt zur Ausführungszeit der ursprüngliche Programmcode vor, was neben dem Zugriff auf die Strukturinformation (Methodendeklaration) auch den Zugriff auf die Implementierung ermöglicht. Beispiele dafür sind Lisp oder Python.
Beispiel in Java
Das folgende Beispiel zeigt eine Methode, die eine beliebige andere Methode eines gegebenen Objekts aufruft und deren Rückgabewert zurückgibt. Aus Gründen der Vereinfachung unterstützt dieses Beispiel nur den Aufruf von Methoden ohne Parameter, die Zeichenketten ("string") zurückgeben.
public String getStringProperty(Object object, String methodname) {
String value = null;
try {
Method getter = object.getClass().getMethod(methodname, new Class[0]);
value = (String) getter.invoke(object, new Object[0]);
} catch (Exception e) {} //Fehlerbehandlung zwecks Übersichtlichkeit nicht implementiert.
return value;
}
Die folgende Anweisung 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"));
Beispiel in Python
x = "A string"
type(x) # ergibt <type 'str'>
x.__class__ # wie oben, <type 'str'>
x.__class__.__name__ # 'str'
# definiere eigene Klasse
class SomeClass(object):
def A(self):
pass
def B(self):
pass
classVar = "some class var"
y = SomeClass() # y ist jetzt eine Instanz von SomeClass
y # <__main__.SomeClass object at 0xb7b676cc>
y.__class__ # <class '__main__.SomeClass'>
y.__class__.__name__ # 'SomeClass'
# Gib Methoden und Attribute von y aus
for i in dir(y):
if i[0] != "_": # verstecke Spezialnamen (beginnen mit "_")
print "%s: %r" % (i, getattr(y, i))
# Ausgabe:
A: <bound method SomeClass.A of <__main__.SomeClass object at 0xb7b676cc>>
B: <bound method SomeClass.B of <__main__.SomeClass object at 0xb7b676cc>>
classVar: 'some class var'
| Dieses Dokument entstammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Es ist dort zu finden unter dem Stichwort Reflexion_%28Programmierung%29, die Liste der bisherigen Autoren befindet sich in der Versionsliste; die Originalfassung kann dort auch bearbeitet werden. Alle Texte der Wikipedia und ihre Derivate stehen unter der GNU-Lizenz für freie Dokumentation. |
