Reflexion (Programmierung)

Reflexion ( englisch Reflexion ) oder Introspektion Bedeutende in der Programmierung that ein Applications seine eigene Struktur kennt und this modifizieren Scan.

Details

Auf unterer Ebene kann Maschinencode im RAM, der von einem Mikroprozessor ausgeführt wird, als reflexiv bezeichnet werden. Ein Solo-Programm ist in der unteren, und Sie können sehen, was Sie tun können und sehen, welche Struktur analysiert und ändert. Reflexion Wird Hauf von Frameworks oder Sprachen Unterstützt, in Einer Maschine Virtuelle ausgeführt Werden sterben, beispielsweise Java , .NET oder Smalltalk und viele Sprachen interpretiert.

Ihre wichtige Rolle ist Reflexion im Zusammenhang mit dem Begriff der Persistenz (persistente Datenhaltung von Objecten und deren Beziehungen ).

Reflexion ermöglicht es bei objektorientierter Programmierung beispielsweise, zur Laufzeit Informationen über Klasse oder deren Instanz abzufragen, beispielsweise in Objective-C (dort typischerweise Introspektion genannt). Bei Einer Methode ist das unter Anderem Derens sichtbarkeit wo Datentyp Dezember Rückgabewert oder der Typ des Übergabeparameter . Die Umsetzung der Abfragemöglichkeiten ist Sprachspezifisch.

Für sterben Realisierung wo Reflexion ist das Speichern von Meta Information im Binärcode des Programm Notwendig. Bei interpretierenden Programmiersprachen Liegen zur Ausführungszeit, wo Ursprünglich Programm – Code vor, wurde NEBEN DEN zugriff Auf die Strukturinformationen (Methodendeklaration) Auch der zugriff auf sterben Implementierung ermöglicht. Beispiele dafür sind PHP , Lisp , Python , Smalltalk und Tcl .

Aber auch Java und all die Sprachen für die Verwendung mit dem .NET Framework, die z. B. C # , Object Pascal , VB.NET oder IronPython unterstützt Reflexion, welches das .NET Framework der Veriügung darstellt. Alle Speech, die das .NET Framework vorangetrieben haben, laut Common Language Specification ( CLS ) laut , das Informationen als Metadaten speichern offenbart.

Die Ausführungsgeschwindigkeit von Code pro Reflexion ist für gewöhnlich kleiner als die von Statistischem Code. Dies liegt auf andere Weise, und die Fäden der Menschen auf der Welt sind bekannt. meine eigenen Worte in den Metadaten Jedwede Konstante eine hohe Laufzeitflexibilität, da Code dynamisch ausgeführt werden kann, neue Instanzen erstellt oder softig Typen und Objekte dynamisch neu strukturiert werden können.

Beispiele

C #

Ihr folgendes Beispiel sieht Ihre Methode, die Ihren Gläubigen andere Methoden von einem gebracht hat. Aus dem Grunde der Vereinfigung unterstützt dieses Beispiel nur den Aufruf von Methoden ohne Parameter, Zeichenketten („String“) zurückgeben.

 public String GetStringProperty ( Objekt obj , String Methodenname )
 {
 String - Wert = Null ;
 versuchen {
 Methode Info - Methode Info = obj . GetType (). GetMethod ( MethodenName );
 Wert = ( String ) Methodeninfo . Aufrufen ( obj , neues Objekt [ 0 ]);
 } catch ( Ausnahme e) {}
 // Fehlerbehandlung zweits Übersicht nicht implementiert.
 Rück Wert ;
 }

Gemeine Lisp

( Funcall ( Suche Symbol "Sünde" ) 3 )

Java

Das folgende Beispiel sieht seine Methode, die die Funktionalität des C # -Beispiels zum hundertsten Mal ist.

public String getStringProperty ( Object- Objekt , String- Methodenname ) {
 String- Wert = null ;
 try {
 Methode getter = Objekt . getClass (). getMethod ( Methodenname , neue Klasse [ 0 ]);
 Wert = ( String ) Getter . Aufruf ( Objekt , neues Objekt [ 0 ]);
 } catch ( Ausnahme e ) {}
 // Fehlerbehandlung zweits Übersicht nicht implementiert.
 Rück Wert ;
}

Die folgende Anweisung würde die Methode getVorname()der Objekte personbilden und ihren Rückgabewert ausgeben.

System . aus . println ( "Vorname von" + Person + "ist"
 + getStringProperty ( Person , "getVorname" ));

PHP

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

Die angegebene Anweisung würde die Eigenschaften der Klasse „ExampleClass“ als Ausgabe zurückliefern.

Die folgende Anweisung liegt in der Weisheit der Statues Variablen der Klasse, die bestehen können:

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

Python

>>> # die Klasse
>>> Klasse Person ( Objekt ):
... def __init__ ( selbst , Name ):
... selbst . name = Name
... def say_hello ( self ):
... Rückkehr 'Hallo % s !' % Selbst . Name
...
>>> # Ihre Objekte
>>> out = Person ( 'Out' )
>>> # Direkt
>>> aus . say_hello ()
Hallo Out !
>>> # Reflexion
>>> m = getattr ( aus , say_hello )
>>> # (entspricht ute.say_hello ())
>>> print m ()
Hallo Out !

Rubin

"eine Schnur" . Klasse # ergibt "String"
"eine Zeichenfolge" . respond_to? ( : size ) # ergibt true -> Objekte können Methodengröße ausführen
"eine Zeichenfolge " . Methoden # ergibt einen Array mit allen Methoden des Objekts
"a String" . Methode ( : concat ) . arity # Gibt sterben Parameter Anzahl der abhängig ist ,
 # Methode concat sterben sterben verlangt
Klasse Buch
 def initialisieren ( * Parameter )
 @title , @author , @chapters = Parameter
 enden
als
a_book = Buch . neu ( "Buchtitel" , "Jemand" , [ "Kapitel I" , "Kapitel II" , "Kapitel III" ] )
a_book . instance_variables # ergibt einen Array aller Objektinstanzvariablen:
 # ["@title", "@author", "@chapters"]
Buch . instance_methods # Gibt alle Instanzimetoden der Klasse Buch aus.

Smalltalk

Statt Methodenrufen auf Objekte wurden in Smalltalk Nachrichten gesandt. Die Oberklasse steht für Objectdie Nachricht perform:(Sowie Varianten für Aufrufe mit Parametern) mit Verfügung, mit der ein Objekt gesendet wird. Die folgenden Codebeispiele (für GNU Smalltalk ) sind ähnlich:

s : = Setze neu .
s hinzufügen: 4 .
s printNl .
s : = Setze durchführen: #new .
s ausführen: #add: mit: 4 .
s ausführen: #printNl .

Tcl

Das folgende Beispiel sieht seine Methode rufe, welche die Funktionalität des obigen C # – und Java-Beispiels eentspricht ist.

oo :: Klasse erstellen Person {
 variable Name Vorname Konstruktor { n v } { set name $ n set Vorname v $ } # This Gewöhnliche, Parameter lösen Methode der Vorname liefert Methode getVorname {} { Rückkehr $ Vorname } # This Methode ruft sterben Methode auf , Deren Namen als Parameter mitgegeben Wird. Verfahren rufe { Methode } { zurückkehren [[ self ] $ Methode ] } }
# Erzeugen eines Objekts Person der Klasse Person
Person Person Meier Franz erstellen

Die folgende Anweisung würde die Methode getVornameder Objekte personbilden und ihren Rückgabewert ausgeben.

puts "Der Vorname lautet [person rufe getVorname]" ;