Introspektion (Informatik)

Introspektion (Informatik)

In der Programmierung bedeutet Reflexion (engl. reflection) bzw. Introspektion, dass ein Programm seine eigene Struktur kennt und diese, wenn nötig, modifizieren kann.

Auf unterster Ebene kann Maschinencode im RAM, der von einem Mikroprozessor ausgeführt wird, als reflexiv bezeichnet werden. Ein solches Programm ist dazu in der Lage, seine Anweisungen wie Daten zu behandeln und kann deshalb seine Struktur analysieren und verändern. Reflexion wird häufig von Hochsprachen unterstützt, die in einer virtuellen Maschine ausgeführt werden, beispielsweise Java oder Smalltalk.

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 abzufragen. 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 interpretierenden 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 PHP, Lisp und Python.

Aber auch Java und alle Sprachen für Verwendung mit dem .NET-Framework, wie z.B. C#, VB.NET oder IronPython unterstützen die Reflexion, die das .NET Framework von sich aus zur Verfügung stellt. Alle Sprachen, die das .NET-Framework verwenden, müssen laut CLS (Common language specification) die entsprechenden Informationen als Metadaten speichern.

Die Ausführungsgeschwindigkeit von Code per Reflexion ist langsamer als die von statischem Code. Dies liegt u.a. an den Stringvergleichen der entsprechenden Namen der gewünschten Methoden, Eigenschaften, usw. mit den Einträgen in den Metadaten. Jedoch bietet Reflexion eine sehr hohe Laufzeitflexibilität, da Code dynamisch aufgerufen werden kann, neue Instanzen erstellt oder sogar Typen und Objekte dynamisch neu strukturiert werden können.

Inhaltsverzeichnis

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 C#

Das folgende Beispiel zeigt eine Methode, die der Funktionalität des Java-Beispiels entspricht.

  public String GetStringProperty(Object obj, String methodName)
  {
    String value = null;
    try  {
         MethodInfo methodInfo = obj.GetType().GetMethod(methodName);
         value = (String)methodInfo.Invoke(obj, new Object[0]);
    }
    catch (Exception e) { } 
    //Fehlerbehandlung auch hier zwecks Übersichtlichkeit nicht implementiert.
 
    return value;
  }

Beispiel in Common Lisp

(funcall (find-symbol "SIN") 3)

Beispiel in Perl

# ohne reflection
my $ute = Person->new();
$foo->getVorname();
 
# mit reflection
my $class  = "Person";
my $method = "getVorname";
my $object = $class->new();
$object->$method();

Beispiel in Python

>>> # das Objekt
>>> class Person(object):
...    vorname = "unbekannt"
...    def getVorname(self):
...        return self.Vorname
...
>>> ute = Person()
>>> # direkt
>>> ute.vorname = "Ute"
>>> ute.getVorname()
Ute
>>> # Reflexion
>>> m = getattr(ute, "getVorname")
>>> m()
Ute

Beispiel in Ruby

"a String".class # ergibt "String"
"a String".respond_to?(:size) # ergibt true -> Objekt kann Methode size ausführen
"a String".methods # ergibt einen Array mit allen Methoden des Objektes
"a String".method(:concat).arity # gibt die Anzahl der Parameter an, 
                                  # die die Methode concat verlangt
class Book
  def initialize(*parameters)
    @title, @author, @chapters = parameters
  end
end
a_book = Book.new("Book Title", "Someone", ["chapter I", "chapter II", "chapter III"])
a_book.instance_variables # ergibt einen Array aller Objektinstanzvariablen: 
                          # ["@title", "@author", "@chapters"]
Book.instance_methods # gibt alle Instanzmethoden der Klasse Book aus.


Beispiel in PHP

<?php
$reflectionExampleObj = new ReflectionClass('ExampleClass');
Reflection::export($reflectionExampleObj );
?>

Die angebene Anweisung würde dann die Eigenschaften der Klasse "ExampleClass" als Ausgabe zurückliefern.

Die folgende Anweisung liefert beispielsweise die statischen Variablen der Klasse, wenn welche existieren:

<?php
$reflectionExampleObj = new ReflectionClass('ExampleClass');
$reflectionExampleObj->getStaticVariables();
?>

Die angebene Anweisung würde dann die Eigenschaften der Klasse "ExampleClass" als Ausgabe zurückliefern.

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Introspektion (Programmierung) — In der Programmierung bedeutet Reflexion (engl. reflection) bzw. Introspektion, dass ein Programm seine eigene Struktur kennt und diese, wenn nötig, modifizieren kann. Auf unterster Ebene kann Maschinencode im RAM, der von einem Mikroprozessor… …   Deutsch Wikipedia

  • Introspektion — Der Begriff Introspektion wird verwendet in der Psychologie, siehe Selbstbeobachtung in der Psychologie, Sozialpsychologie und Soziologie für die Methode der Dialogischen Introspektion in der Medizin für die Einsicht in das Körperinnere in der… …   Deutsch Wikipedia

  • Beans — JavaBeans sind Software Komponenten für die Programmiersprache Java. JavaBeans entwickelten sich aus der Notwendigkeit heraus, GUI Klassen (AWT, Swing) einfach instanziieren (Reflexion) und übertragen (RMI) zu können. JavaBeans werden auch als… …   Deutsch Wikipedia

  • JavaBean — JavaBeans sind Software Komponenten für die Programmiersprache Java. JavaBeans entwickelten sich aus der Notwendigkeit heraus, GUI Klassen (AWT, Swing) einfach instanziieren (Reflexion) und übertragen (RMI) zu können. JavaBeans werden auch als… …   Deutsch Wikipedia

  • Java Beans — JavaBeans sind Software Komponenten für die Programmiersprache Java. JavaBeans entwickelten sich aus der Notwendigkeit heraus, GUI Klassen (AWT, Swing) einfach instanziieren (Reflexion) und übertragen (RMI) zu können. JavaBeans werden auch als… …   Deutsch Wikipedia

  • Javabeans — sind Software Komponenten für die Programmiersprache Java. JavaBeans entwickelten sich aus der Notwendigkeit heraus, GUI Klassen (AWT, Swing) einfach instanziieren (Reflexion) und übertragen (RMI) zu können. JavaBeans werden auch als Container… …   Deutsch Wikipedia

  • Bewusstseinsphilosophie — Die Philosophie des Geistes (engl.: Philosophy of mind [1]) beschäftigt sich mit der Natur geistiger oder mentaler[1] Zustände, ihren Wirkungen und Ursachen. Zentral ist dabei die Frage nach dem Verhältnis von geistigen und körperlichen Zuständen …   Deutsch Wikipedia

  • Körper-Geist-Problem — Die Philosophie des Geistes (engl.: Philosophy of mind [1]) beschäftigt sich mit der Natur geistiger oder mentaler[1] Zustände, ihren Wirkungen und Ursachen. Zentral ist dabei die Frage nach dem Verhältnis von geistigen und körperlichen Zuständen …   Deutsch Wikipedia

  • Körper-Geist Problem — Die Philosophie des Geistes (engl.: Philosophy of mind [1]) beschäftigt sich mit der Natur geistiger oder mentaler[1] Zustände, ihren Wirkungen und Ursachen. Zentral ist dabei die Frage nach dem Verhältnis von geistigen und körperlichen Zuständen …   Deutsch Wikipedia

  • Leib-Seele-Problem — Die Philosophie des Geistes (engl.: Philosophy of mind [1]) beschäftigt sich mit der Natur geistiger oder mentaler[1] Zustände, ihren Wirkungen und Ursachen. Zentral ist dabei die Frage nach dem Verhältnis von geistigen und körperlichen Zuständen …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”