Muster reflektion

Partager
Copier le lien

Die effektive Verwendung von Reflektion erfordert fast immer einen Plan: Ein Entwurfsframework, Codierungsbeschreibung, Objektbibliothek, eine Zuordnung einer Datenbank oder Entitätsbeziehungen. Debuggen und Testen von Tools: Debugger verwenden die Eigenschaft der Reflektion, um private Member in Klassen zu untersuchen. Reflection kann zum Beobachten und Ändern der Programmausführung zur Laufzeit verwendet werden. Eine reflexionsorientierte Programmkomponente kann die Ausführung eines Codegehäuses überwachen und sich entsprechend einem gewünschten Ziel in Bezug auf dieses Gehäuse ändern. Dies wird in der Regel durch dynamischezuweisung von Programmcode zur Laufzeit erreicht. Anschließend wird die Reflektion erneut verwendet, um den entsprechenden Setter für das Element – -eigenschaft > abzubekommen und seinen Wert auf den angegebenen Wert festzulegen. Der Ruhezustand hat sich für die Reflexion entschieden, da sie nur minimale Auswirkungen auf den Buildprozess für eine Anwendung hat. Es ist in vielen Situationen nutzbringt. Überall, wo Sie in der Lage sein möchten, Klassen dynamisch in Ihren Code einzustecken. Viele relationale Objektzuordnungsspieler verwenden Reflektion, um Objekte aus Datenbanken instanziieren zu können, ohne im Voraus zu wissen, welche Objekte sie verwenden werden.

Plug-in-Architekturen ist ein weiterer Ort, an dem Reflektion sinnvoll ist. In diesen Situationen ist es wichtig, Code dynamisch laden und feststellen zu können, ob es Typen gibt, die die richtige Schnittstelle implementieren, die als Plugin verwendet werden kann. Die Namensreflektion wird verwendet, um Code zu beschreiben, der in der Lage ist, anderen Code im selben System (oder selbst) zu überprüfen. Beispielsweise verfügen alle Objekte in Java über die Methode getClass(), mit der Sie die Objektklasse bestimmen können, auch wenn Sie sie zur Kompilierungszeit nicht kennen (z. B. wenn Sie es als Objekt deklariert haben) – dies mag trivial erscheinen, aber eine solche Reflexion ist in weniger dynamischen Sprachen wie C++ nicht möglich. Mit erweiterten Anwendungen können Sie Methoden, Konstruktoren usw. auflisten und aufrufen. In objektorientierten Programmiersprachen wie Java ermöglicht reflektionierung das Überprüfen von Klassen, Schnittstellen, Feldern und Methoden zur Laufzeit, ohne die Namen der Schnittstellen, Felder, Methoden zur Kompilierungszeit zu kennen. Es ermöglicht auch die Instanziierung neuer Objekte und den Aufruf von Methoden. Reflektion macht eine Sprache besser geeignet für netzwerkorientierten Code. Beispielsweise unterstützt es Sprachen wie Java, um in Netzwerken gut zu funktionieren, indem Bibliotheken für Serialisierung, Bündelung und unterschiedliche Datenformate aktiviert werden.

Sprachen ohne Reflektion (z.B. C) müssen Hilfscompiler, z.B. für Abstract Syntax Notation, verwenden, um Code für Serialisierung und Bündelung zu erzeugen. Da Reflektion Typen umfasst, die dynamisch aufgelöst werden, können bestimmte Java-Optimierungen für virtuelle Maschinen nicht durchgeführt werden. Daher weisen reflektierende Vorgänge eine langsamere Leistung auf als ihre nicht reflektierenden Gegenstücke und sollten in Codeabschnitten vermieden werden, die häufig in leistungsempfindlichen Anwendungen aufgerufen werden. Die folgenden Codeausschnitte erstellen eine Instanz foo der Klasse Foo und rufen die Methode PrintHello auf. Für jede Programmiersprache werden normale und reflektionsbasierte Aufrufsequenzen angezeigt. Java Reflection ist sehr leistungsstark und kann sehr nützlich sein.

Java Reflection ermöglicht es, Klassen, Schnittstellen, Felder und Methoden zur Laufzeit zu überprüfen, ohne die Namen der Klassen, Methoden usw. zur Kompilierungszeit zu kennen. Es ist auch möglich, neue Objekte zu instanziieren, Methoden aufzurufen und Feldwerte mithilfe von Reflektion zu abrufen/fest. Es gibt einige gute Reflektionsbeispiele, um Sie bei docs.oracle.com/javase/tutorial/reflect/index.html Eine meiner Lieblingsverwendungen der Reflexion ist die untenstehende Java-Dump-Methode. Es nimmt jedes Objekt als Parameter und verwendet die Java-Reflektions-API, um jeden Feldnamen und Wert auszudrucken. Betrachten wir eine weitere beliebte Implementierung des Factory-Musters. Dieser Ansatz nutzt keine abstrakten Fabriken. Es verwendet nur eine Betonfabrik, um Objekte zu erstellen; daher ist es wesentlich weniger komplex. Werfen wir einen Blick darauf, wie der Code in MainClass, InventoryMgr und PartsFactory aussieht. IPartsInventory hat sich nicht geändert (siehe Abbildung 2).