Was ist die Reflektionseigenschaft einer Programmiersprache?

8

Es heißt, dass die meisten dynamischen Sprachen auf hoher Ebene reflexiv sind. Reflection (Computerprogrammierung) auf Wikipedia erklärt, aber es gibt nicht wirklich ein sehr klares Bild von dem, was es ist meint. Kann das jemand anhand eines relevanten Beispiels einfacher erklären?

    
Tirth Pandya 24.01.2013, 15:49
quelle

5 Antworten

4

Um Ihnen ein Beispiel zu geben, wie Reflection praktisch verwendet werden kann:

Nehmen wir an, Sie entwickeln eine Anwendung, die Sie mit Plugins erweitern möchten. Diese Plugins sind einfache Assemblies, die nur eine Klasse namens Person enthalten:

%Vor%

Nun, Plugins sollten Ihre Anwendung zur Laufzeit erweitern. Das bedeutet, dass der Inhalt und die Logik von einer anderen Assembly geladen werden sollten, wenn Ihre Anwendung bereits ausgeführt wird. Dies bedeutet, dass diese Ressourcen nicht in Ihre Assembly kompiliert werden, d. H. MyApplication.exe. Nehmen wir an, sie befinden sich in einer Bibliothek: MyObjects.Person.dll.

Sie sind nun mit der Tatsache konfrontiert, dass Sie diese Informationen extrahieren müssen und beispielsweise auf die Funktion GetName () von MyObjects.Person aus zugreifen müssen.

%Vor%

Wie Sie sehen können, könnten Sie System.Reflection für das dynamische Laden von Ressourcen bei Laufzeit verwenden. Dies könnte eine Hilfe sein, um zu verstehen, wie Sie es verwenden können.

Sehen Sie sich auf dieser Seite Beispiele an, um auf Baugruppen detaillierter zuzugreifen. Es ist im Grunde der gleiche Inhalt, den ich geschrieben habe.

    
Dennis Alexander 25.01.2013, 10:49
quelle
2

Um besser zu verstehen, denken Sie an einen Interpreter, der ein Programm evaluiert . Der Interpreter ist ein Programm, das andere Programme auswertet.

Das Programm kann (1) inspizieren und (2) seinen (eigenen) Zustand / sein Verhalten oder den Zustand / das Verhalten des Interpreten, der es ausführt (b), ändern.

Es gibt dann vier Kombinationen. Hier ist ein Beispiel für jede Art von Aktion:

  • 1a - Lesen Sie die Liste der Felder, die ein Objekt hat
  • 2a - Änderung des Wertes eines Feldes basierend auf dem Namen des Feldes; Reflektierender Aufruf von Methoden.
  • 1b - Untersuchen Sie den aktuellen Stapel, um zu wissen, was die aktuelle Methode ist, die ausgeführt wird
  • 2b - Modifiziere den Stapel oder wie bestimmte Operationen in der Sprache ausgeführt werden (z. B. Nachrichten senden).

Typ a heißt Strukturreflexion. Typ b heißt Verhaltensreflexion. Die Reflexion des Typs a ist in einer Sprache relativ einfach zu erreichen. Die Reflexion vom Typ b ist viel komplizierter, besonders 2b - das ist ein offenes Forschungsthema. Was die meisten Menschen durch Reflexion verstehen, ist 1a und 2a.

Es ist wichtig, das Konzept der Vergegenständlichung zu verstehen, um die Reflexion zu verstehen. Wenn eine Anweisung in dem Programm, das interpretiert wird, ausgewertet wird, muss der Interpreter sie darstellen. Der Interpreter hat wahrscheinlich Objekte, um Feld, Methoden usw. des zu interpretierenden Programms zu modellieren. Schließlich ist der Dolmetscher auch ein Programm. Mit Reflexion kann das interpretierte Programm Referenzen auf Objekte im Interpreter erhalten, die seine eigene Struktur darstellen. Das ist Verdinglichung. (Der nächste Schritt wäre, kausale Verbindung zu verstehen)

Es gibt verschiedene Arten von reflektierenden Merkmalen und es ist manchmal verwirrend zu verstehen, was reflektiert oder nicht ist und was es bedeutet. Denken in Programm und Dolmetscher. Ich hoffe, es wird Ihnen helfen, die Wikipedia-Seite zu verstehen (die verbessert werden könnte).

    
ewernli 28.01.2013 10:40
quelle
1

Reflection ist die Fähigkeit, die Metadaten, die Sie während der Laufzeit geschrieben haben, abzufragen. Beispiel: Welche Klassen innerhalb einer Assembly gefunden werden, welche Methoden, Felder und Eigenschaften diese Klassen enthält und mehr.

.net enthält sogar 'Attribute', das sind Klassen, die Sie mit ihnen Klassen, Methoden, Felder und mehr dekorieren können. Und all ihr Zweck ist es, benutzerdefinierte Metadaten hinzuzufügen, die Sie in der Laufzeit abfragen können.

Viele Details hängen nur von Metadaten ab. Zum Zeitpunkt der Validierung ist uns egal, String oder int, aber wir sorgen dafür, dass es nicht null sein sollte. In diesem Fall müssen Sie eine Eigenschaft oder ein Attribut überprüfen, ohne sich um bestimmte Klassen kümmern zu müssen. Dort kommt Reflexion ins Bild. Und genauso, wenn Sie Methoden auf einer Fliege generieren möchten (wie im dynamischen Objekt von C # 4.0 verfügbar), ist es auch möglich, Reflektionen zu verwenden. Grundsätzlich hilft es, verhaltensorientierte oder aspektorientierte Programmierung zu machen.

Eine weitere beliebte Anwendung ist das Testing Framework. Sie verwenden Reflektion, um Methoden zum Testen und Ausführen in einer Proxy-Umgebung zu finden.

    
Shani Elharrar 25.01.2013 10:33
quelle
0

Es ist die Fähigkeit einer Programmiersprache, ihr Verhalten basierend auf Laufzeitinformationen anzupassen. In der .Net / C # -Welt wird dies häufig verwendet. Wenn Sie beispielsweise Daten in xml serialisieren, kann ein Attribut hinzugefügt werden, um den Namen des Feldes in der resultierenden XML anzugeben.

    
Chriseyre2000 25.01.2013 10:34
quelle
0

Dies ist wahrscheinlich eine bessere Frage für programmers.stackexchange.com.

Aber es bedeutet im Grunde nur, dass Sie Ihren Code aus Ihrem Code heraus betrachten können.

Zurück in meinen VB6-Tagen gab es einige UI-Objekte, die eine Text-Eigenschaft hatten und andere, die eine Beschreibung hatten (oder etwas anderes als 'Text' sowieso, ich vergesse). Es war ein Schmerz, weil ich Code nicht kapseln konnte, um beide Arten von Objekten auf die gleiche Weise zu behandeln. Mit Reflektion hätte ich zumindest sehen können, ob ein Objekt eine Text- oder eine Description-Eigenschaft hat.

Oder manchmal haben Objekte beide eine Text-Eigenschaft, aber sie stammen von verschiedenen Basisklassen und haben keine Schnittstelle für sie. Auch hier ist es schwierig, Code in einer statisch typisierten Sprache ohne die Hilfe von Reflektion zu kapseln, aber mit Reflektion kann sogar eine statisch typisierte Sprache damit umgehen.

    
Brandon Moore 25.01.2013 10:37
quelle