2013-08-09 15 views
6

Soweit ich wissen und verstehen,Statische Sprachen und Reflexion

Reflection ist die Fähigkeit, Quellcode zur Laufzeit erstellen/ändern.

Aus Wikipedia:

  • Entdecken und ändern Konstruktionen Quellcode (wie Codeblocks, Klassen, Methoden, Protokolle, etc.) als First-Class-Objekt bei Laufzeit.
  • Konvertieren Sie eine Zeichenfolge, die dem symbolischen Namen einer Klasse oder Funktion entspricht, in eine Referenz auf oder den Aufruf dieser Klasse oder Funktion.
  • Bewerten Sie eine Zeichenfolge, als wäre es eine Quellcodeanweisung zur Laufzeit.
    Erstellen Sie einen neuen Interpreter für den Bytecode der Sprache, um einen neuen
    Sinn oder Zweck für ein Programmierkonstrukt zu geben.

Dynamische Sprachen sind Sprachen, die wir (auswerten direkt von string) zur Laufzeit eval kann.

Aus Wikipedia: „Erweiterung des Programms durch neuen Code hinzufügen, die von Objekten und Definitionen erstreckt, oder durch die Art System zu modifizieren“

Ok, jetzt, meine Frage ist: Wie statische Sprache ד (ohne Eval Fähigkeit) kann Reflexion (zB Java) haben? (der neue Quellcode wird nicht ausgewertet?: /)

Vielen Dank im Voraus!

+0

Java verfügt über eine Bytecode-Manipulationsbibliothek namens [ASM] (http://asm.ow2.org/).Reflection wird nicht verwendet, um neuen Code hinzuzufügen, den Sie in Ihrer Frage beschreiben. –

+1

Reflection ermöglicht das Manipulieren (ja, es kann in einigen Fällen schädlich sein) mit einer Klasse, indem es nach seinen Methoden, Feldern, Zugriffsebenen und dergleichen fragt, aber _nicht einen neuen Code_ erzeugt. Es hat andere Verwendungen, wie zum Beispiel das Aufrufen einer in einer bestimmten Klasse definierten Methode, die nur auf Daten darüber basiert (* Metadaten *). Sie erhalten eine Instanz von einer Klasse, Sie erhalten eine Methode basierend auf ihrer Firma und dann rufen Sie sie auf. – Gamb

+0

@Gambus 10x, aber wenn du einen Quellcode änderst, also du einen Quellcode erzeugst (wie Wikipedia sagt), nicht wahr? – gran33

Antwort

4

Ich denke, Wikipedia Erklärung ist nicht wirklich gut formuliert.

Reflection (oder Selbstbeobachtung) geht es nicht um die Schaffung von Code während der Laufzeit, sondern um die Fähigkeit des Codes zu reflektiert sich in Runtime (und ändern Sie das Verhalten auf dieser Basis). Beispiele wären Informationen über den Typ des Objekts (wie RTTI in C++) oder das Abrufen von Metadaten mit Objekten (wie Anmerkungen in Java).

Laufzeit-Code-Generation ist mehr First-Classness als zur Reflexion, so würde ich argumentieren, dass aktuelle Wikipedia-Artikel ist eine Art irreführend.

UPDATE

Mit anderen Worten dieser Antwort:

Ok, jetzt, meine Frage ist, wie statische Sprache kann (ohne eval Fähigkeit) kann Reflexion haben (zum Beispiel Java)?

... würde diese Reflexion nicht auf Evel Fähigkeit verlassen. Dies sind 2 separate Sprachfunktionen.

Und auch, wie Giulio Franco in den Kommentaren darauf hingewiesen hat - Java ist in der Lage, Laufzeitcode-Generierung \ Manipulation (siehe CGLIB zum Beispiel).

+1

Ich möchte hinzufügen, dass Java-Klassen zur Laufzeit geladen werden, und es gibt eine Java-Klasse, mit der Sie eine Java-Klasse im laufenden Betrieb kompilieren und laden können. Java ** kann also zur Laufzeit Code hinzufügen. Vielleicht können Sie auch eine Klasse entfernen, ändern und neu laden, aber ich denke, das hat einige Einschränkungen (vielleicht können Sie eine aktuell verwendete Klasse nicht löschen). –