Java: Welche Szenarien erfordern die Verwendung von Reflektion?

8

Nachdem ich einige der Artikel gelesen hatte, war die Nachricht, die ich herausbekommen habe, in der Lage zu sein, Felder zu ändern und Werte in Klassen ohne Neukompilierung in Echtzeit zu setzen.

ist es also möglich, dies zu Java-Bibliothek Klassen von Drittanbietern zu tun, die keinen Quellcode verfügbar ist / ist es möglich, mit Reflektion Klasseninstanzen zur Laufzeit zu ändern?

In welchen anderen Szenarien wird Reflektion häufig verwendet?

Ich versuche zu verstehen, wie Reflexion anwendbar sein kann.

    
KJW 10.02.2012, 04:18
quelle

7 Antworten

11

Jedes Mal, wenn Sie zur Laufzeit mit einer Zeichenfolge arbeiten und einen Teil dieser Zeichenfolge als Kennung in der Sprache behandeln möchten.

  1. Remote-Prozedur-Aufruf - Behandlung eines Teils einer Nachricht, die über das Netzwerk empfangen wurde, als Methodenname.
  2. Serialisierung und Deserialisierung - konvertiert Feldnamen in Zeichenfolgen, damit Sie die Felder des Objekts in einen Stream schreiben und später wieder in ein Objekt konvertieren können.
  3. Objektrelationale Zuordnungen - Pflegen Sie eine Beziehung zwischen Feldern in einem Objekt und Spalten in einer Datenbank.
  4. Interfaces mit dynamisch typisierten Skriptsprachen - Verwandeln Sie einen von einer Skriptsprache erzeugten String-Wert in einen Verweis auf ein Feld oder eine Methode für ein Objekt.

Es kann auch verwendet werden, um Sprachfunktionen in der Sprache zu emulieren. Betrachten Sie die Befehlszeile java com.example.MyClass , die eine Zeichenfolge in einen Klassennamen umwandelt. Dies erfordert keine Reflektion, da die ausführbare Datei java eine .class -Datei in Code umwandeln kann, aber ohne Reflektion wäre es nicht möglich, java com.example.Wrapper com.example.MyClass zu schreiben, wo Wrapper an ihr Argument delegiert wie in:

%Vor%     
Mike Samuel 10.02.2012, 04:32
quelle
3

In einem anderen Fall entwickeln Sie IDEs wie Eclipse / Netbeans usw., um zu bestimmen, welche Methoden in einer abstrakten Klasse von einer Kindklasse implementiert werden müssen, und schreibt automatisch die fehlende Methode für Sie (ein Beispiel).

    
kosa 10.02.2012 04:20
quelle
2

Reflexion wird verwendet, wenn es erforderlich ist, in die andere classes in deeper level zu gelangen. In den meisten Fällen haben diese Implementierer daher das Containerverhalten. Zum Beispiel wird die Abhängigkeitsinjektion hauptsächlich unter Verwendung von Reflexion durchgeführt. Wenn Sie hierfür ein Framework benötigen, führt Spring seine Abhängigkeitsinjektionsjobs mit Hilfe von reflection API aus.

  

Sie finden auch Reflexionen hinter den Kulissen in vielen Bereichen.   Zum Beispiel, wenn Sie JAXB verwendet haben, dann viele der Marshalling / Unmarshalling von   Das XML wird mit Hilfe von Reflektionen erstellt. Häufig ergeben sich Anmerkungen in Ihrem Code   in Reflexionen, die hinter den Kulissen verwendet werden. Wenn Sie Komponententests durchführen,   Besonders wenn man Klassen und / oder Methoden verspottet, gibt es oft viele Reflexionen   Code verwendet wird.

    
Sumit Singh 10.02.2012 04:41
quelle
1

Injection-Frameworks wie Guice oder Spring verwenden Reflektionen, um Ihnen beim Erstellen von Instanzen zu helfen von Objekten zur Laufzeit.

    
Louis Wasserman 10.02.2012 04:24
quelle
0

Reflection ist auch nützlich in Fällen, in denen Konfiguration erforderlich ist, um Dinge aneinander zu reihen. Zum Beispiel habe ich in einer Anwendung, die ich geschrieben habe, eine Annotation @Report ("debitiert"), die einfach zu Methoden hinzugefügt wird, die Berichte generieren. In der XML-Konfiguration kann ein Benutzer einfach hinzufügen:

%Vor%

Dadurch wird der Kesselblechcode von der Zuordnung des XML-Codes zur tatsächlichen Methode minimiert, da die Reflektion die Berichtsmethoden erkennen und direkt zur Verfügung stellen kann.

    
Jaco Van Niekerk 30.12.2016 09:03
quelle
0
___ qstnhdr ___ Java: Welche Szenarien erfordern die Verwendung von Reflektion? ___ answer9222787 ___

Reflexion wird verwendet, wenn es erforderlich ist, in die andere %code% zu gelangen. In den meisten Fällen haben diese Implementierer daher das Containerverhalten. Zum Beispiel wird die Abhängigkeitsinjektion hauptsächlich unter Verwendung von Reflexion durchgeführt. Wenn Sie hierfür ein Framework benötigen, führt Spring seine Abhängigkeitsinjektionsjobs mit Hilfe von %code% aus.

  

Sie finden auch Reflexionen hinter den Kulissen in vielen Bereichen.   Zum Beispiel, wenn Sie JAXB verwendet haben, dann viele der Marshalling / Unmarshalling von   Das XML wird mit Hilfe von Reflektionen erstellt. Häufig ergeben sich Anmerkungen in Ihrem Code   in Reflexionen, die hinter den Kulissen verwendet werden. Wenn Sie Komponententests durchführen,   Besonders wenn man Klassen und / oder Methoden verspottet, gibt es oft viele Reflexionen   Code verwendet wird.

    
___ answer9222668 ___

Injection-Frameworks wie Guice oder Spring verwenden Reflektionen, um Ihnen beim Erstellen von Instanzen zu helfen von Objekten zur Laufzeit.

    
___ answer41393457 ___

Reflection ist auch nützlich in Fällen, in denen Konfiguration erforderlich ist, um Dinge aneinander zu reihen. Zum Beispiel habe ich in einer Anwendung, die ich geschrieben habe, eine Annotation @Report ("debitiert"), die einfach zu Methoden hinzugefügt wird, die Berichte generieren. In der XML-Konfiguration kann ein Benutzer einfach hinzufügen:

%Vor%

Dadurch wird der Kesselblechcode von der Zuordnung des XML-Codes zur tatsächlichen Methode minimiert, da die Reflektion die Berichtsmethoden erkennen und direkt zur Verfügung stellen kann.

    
___ antwort43340500 ___

Ich wurde gebeten, eine Lösung für die folgende Aussage zu erstellen.

"1) Ein diff-Service, der:    • kann die Unterschiede zwischen zwei Objekten berechnen und das Ergebnis zurückgeben      "diff"    • kann ein zuvor erstelltes "diff" gegen ein Originalobjekt anwenden, so dass      Das zurückgegebene Objekt entspricht dem geänderten Objekt, das für die Berechnung verwendet wurde      das diff. "

Dies wäre sehr schwierig gewesen ohne die Verwendung von Reflektion. Mit Reflektion konnte ich alle Klassenelemente, Eigenschaften und Methoden des unbekannten Objekts auflisten. Ich könnte diese verwenden, um die im Objekt enthaltenen Werte zu erhalten. Ich könnte die Werte der ursprünglichen und der modifizierten Objekte vergleichen, ein "diff" -Objekt erstellen, das die Änderungen zwischen den beiden Objekten widerspiegelt.

Mit Java Reflection konnte ich dann die Anweisungen im "diff" -Objekt lesen und diese auf das ursprüngliche Objekt anwenden. Die Java-Reflektion gab mir die Werkzeuge, um die Werte der unbekannten Eigenschaften des ursprünglichen Objekts zu ändern. Ich könnte Setter-Methoden aufrufen und Typen instanziieren, wenn die ursprüngliche Eigenschaft null war, um den geänderten Wert für das ursprüngliche Objekt festzulegen.

Die "diff" -App funktioniert auf zwei beliebigen Objekten des gleichen Typs, aber sie können jeden Typ haben, beide Objekte müssen nur vom selben Typ sein.

Reflection ist sehr leistungsfähig und erlaubt uns, echte generische polymorphe Methoden, Funktionen, Bibliotheken und Systeme zu erstellen, wobei der übergebene Objekttyp zur Kompilierzeit nicht bekannt sein muss. Dies gilt, wenn Sie Java Reflection und Generics zusammen verwenden, eine sehr leistungsfähige Kombination.

Zu Ende habe ich auch Java Reflection verwendet, um eine generische Sortierfunktion zu erstellen, die jede Liste eines beliebigen Klassentyps unter Verwendung einer beliebigen Eigenschaft der Klasse als Sortierschlüssel sortieren kann. So lange die aufrufende Methode die Liste bestanden hat und der zu verwendende Eigenschaftsname würde die Methode eine sortierte Liste zurückgeben.

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123reflection ___ Reflection ist die Fähigkeit eines Programms, seine Struktur und / oder sein Verhalten zur Laufzeit zu beobachten und / oder zu ändern. ___ answer43930278 ___

Hier sind einige Fälle, in denen Reflektionen in

verwendet werden sollen %Vor%

Ein weiterer Fall mit der String-Klasse

%Vor%

Laden von XML mit Reflektion

%Vor%     
___ answer9222725 ___

Jedes Mal, wenn Sie zur Laufzeit mit einer Zeichenfolge arbeiten und einen Teil dieser Zeichenfolge als Kennung in der Sprache behandeln möchten.

  1. Remote-Prozedur-Aufruf - Behandlung eines Teils einer Nachricht, die über das Netzwerk empfangen wurde, als Methodenname.
  2. Serialisierung und Deserialisierung - konvertiert Feldnamen in Zeichenfolgen, damit Sie die Felder des Objekts in einen Stream schreiben und später wieder in ein Objekt konvertieren können.
  3. Objektrelationale Zuordnungen - Pflegen Sie eine Beziehung zwischen Feldern in einem Objekt und Spalten in einer Datenbank.
  4. Interfaces mit dynamisch typisierten Skriptsprachen - Verwandeln Sie einen von einer Skriptsprache erzeugten String-Wert in einen Verweis auf ein Feld oder eine Methode für ein Objekt.

Es kann auch verwendet werden, um Sprachfunktionen in der Sprache zu emulieren. Betrachten Sie die Befehlszeile %code% , die eine Zeichenfolge in einen Klassennamen umwandelt. Dies erfordert keine Reflektion, da die ausführbare Datei %code% eine %code% -Datei in Code umwandeln kann, aber ohne Reflektion wäre es nicht möglich, %code% zu schreiben, wo %code% an ihr Argument delegiert wie in:

%Vor%     
___ qstntxt ___

Nachdem ich einige der Artikel gelesen hatte, war die Nachricht, die ich herausbekommen habe, in der Lage zu sein, Felder zu ändern und Werte in Klassen ohne Neukompilierung in Echtzeit zu setzen.

ist es also möglich, dies zu Java-Bibliothek Klassen von Drittanbietern zu tun, die keinen Quellcode verfügbar ist / ist es möglich, mit Reflektion Klasseninstanzen zur Laufzeit zu ändern?

In welchen anderen Szenarien wird Reflektion häufig verwendet?

Ich versuche zu verstehen, wie Reflexion anwendbar sein kann.

    
___ answer9222634 ___

In einem anderen Fall entwickeln Sie IDEs wie Eclipse / Netbeans usw., um zu bestimmen, welche Methoden in einer abstrakten Klasse von einer Kindklasse implementiert werden müssen, und schreibt automatisch die fehlende Methode für Sie (ein Beispiel).

    
___
Groenlantern 11.04.2017 08:23
quelle
0

Hier sind einige Fälle, in denen Reflektionen in

verwendet werden sollen %Vor%

Ein weiterer Fall mit der String-Klasse

%Vor%

Laden von XML mit Reflektion

%Vor%     
ZapMeDo 12.05.2017 05:57
quelle

Tags und Links