In diesem Artikel wird der Java -Reflexionsmechanismus in einem Beispiel analysiert. Teilen Sie es für Ihre Referenz wie folgt weiter:
Reflection, ich hörte sie oft sagen, dass ich einige Materialien gelesen habe und sie möglicherweise im Designmuster verwendet habe, aber ich hatte das Gefühl, dass ich es dieses Mal wieder ein tieferes Verständnis hatte und es fühlte sich in Ordnung an!
1. Schauen wir uns das Konzept der Reflexion an:
Es bezieht sich hauptsächlich auf eine Fähigkeit, auf die ein Programm auf seinen eigenen Zustand oder Verhalten zugreifen, erkennen und ändern kann und den Zustand und die damit verbundene Semantik des von Anwendungen beschriebenen Verhaltens anhand des Zustands und der Ergebnisse seines eigenen Verhaltens anpassen oder ändern kann.
Reflection ist ein leistungsstarkes Tool in Java, mit dem wir einfach flexible Code erstellen können, der beim Ausführen montiert werden kann, ohne den Quellcode zwischen den Komponenten verknüpfen zu müssen. Aber die unangemessene Verwendung von Reflexion wird sehr kostspielig sein!
Es ist schwindelig, das Konzept zu sehen und weiterzulesen.
2. Die Rolle des Reflexionsmechanismus:
1. Dekompile: .Class->. Java
2. Zugriff auf die Eigenschaften, Methoden, Konstruktoren usw. von Java -Objekten durch den Reflexionsmechanismus;
Dies scheint einfacher zu verstehen.
3. Schauen wir uns zunächst die Klassen an, die uns die Sonne mit dem Reflexionsmechanismus vermittelt:
java.lang.class; java.lang.reflect.constructor;
Wir können viele Methoden, Attribute und andere Operationen in Reflexion aus diesen vier Klassen abfragen. Oder müssen Sie lernen, die API ständig abzufragen?
4. Spezifische Funktionen Implementierung:
1. Es gibt drei Möglichkeiten, die Klasse nach Reflexionsmechanismus zu erhalten.
// die erste Methode: classc1 = class.Forname ("Mitarbeiter") // die zweite Methode: Jeder Typ in Java hat ein Klassenattribut. Das Objekt in der Java -Sprache hat eine GetClass -Methode.2. Erstellen Sie ein Objekt: Nachdem wir die Klasse erhalten haben, erstellen wir sein Objekt und verwenden NewInstance:
Klasse C = class.Forname ("Mitarbeiter"); // Erstellen Sie eine neue Instanz der Klasse, die von diesem Klassenobjekt Objekt = C.Newinstance () dargestellt wird.3. Nehmen Sie Attribute ab: In alle Attribute und angegebenen Attribute unterteilt:
①.
// Holen Sie sich die gesamte Klasse Klasse c = class.forname ("java.lang.Ineger"); // Alle Attribute erhalten? Feld [] fs = C.Getdeclaredfields (); // Definieren Sie die String mit variabler Länge, zum Speichern zum Speichern Das Attribut StringBuffer sb = new StringBuffer (); // Teilen Sie jedes Attribut in diese Zeichenfolge auf, indem Sie die methode anhängen // die äußerste öffentliche Definition sb.append (modifier.toString (C.GetModifiers ()) + "Klasse" + C.GetSimpleName ( ) +"{/n"); // Jede Eigenschaft im Inneren für (Feld Feld: fs) {sb.append ("/t"); // Space sb.append (Modifier .ToString (field.getModifiers ()) + +) ""); // Holen Sie sich die Modifikatoren des Attributs wie öffentlich, statisch usw. field.getName () + ";/n"); // Eigenschaftsname + Eingeben} sb.append ("}"); System.out.println (SB);②.
public static void main (String [] args) löst eine Ausnahme aus {<span style = "White-Space: PRE"> </Span> // Vorherige Wege:/* Benutzer u = neuer Benutzer (); // system.out.println (u.age); ); // den Wert "110" dem ID -Attribut des O -Objekts IDF.Set (O, "110") zuweisen;4. Erhalten Sie Methoden und Konstruktionsmethoden, beschreiben Sie nicht mehr im Detail. Schauen Sie sich einfach die Schlüsselwörter an:
Methodenschlüsselwörter
Bedeutung
GetDeclaredMethods ()
Holen Sie sich alle Methoden
GetReturnType ()
Holen Sie sich den Rückgabetyp der Methode
getParameterTypes ()
Rufen Sie den eingehenden Parametertyp der Methode ab
getDeclaredMethod ("Methodame", Parameter type.class, ...)
Erhalten Sie eine bestimmte Methode
Konstruktor -Schlüsselwörter
Bedeutung
GetDeclaredConstructors ()
Holen Sie sich alle Konstruktoren
getDeclaredConstructor (Parametertyp.class, ...)
Holen Sie sich einen bestimmten Konstruktor
Elternklasse und übergeordnete Schnittstelle
Bedeutung
GetuperClass ()
Holen Sie sich die Elternklasse einer bestimmten Klasse
GetInterfaces ()
Erhalten Sie eine Schnittstelle für eine bestimmte Art von Implementierung
Auf diese Weise können wir verschiedene Inhalte der Klasse bekommen und sie dekompilieren. Für eine Sprache wie Java, die zuerst kompiliert und dann ausgeführt wird, kann der Reflexionsmechanismus den Code flexibler und leichter zu implementieren. Objektorientiert.
5. Reflection Plus -Konfigurationsdateien machen unser Programm flexibler:
Bei der Untersuchung von Entwurfsmustern wird beim Erlernen abstrakter Fabriken die Reflexion verwendet, um die Datenbankverbindungsketten usw. bequem zu lesen, sodass ich sie zu diesem Zeitpunkt nicht sehr viel verstanden habe, also habe ich sie entsprechend kopiert. Schauen Sie sich die Verwendung von Reflexion + Konfigurationsdateien in .NET an:
Die zu diesem Zeitpunkt verwendete Konfigurationsdatei war App.config -Datei, und der Inhalt befand sich im XML -Format, und der Inhalt der verknüpften Datenbank wurde ausgefüllt:
<Configuration> <AppSettings> <add key = "" value = ""/> </AppSettings> </configuration>
Wie man Reflexion schreibt:
montage.load ("Der Name der aktuellen Montage"). CreateInstance ("Der Name des aktuellen Namespace". Der zu instanziierte Klassenname);
Dieser Vorteil ist, dass es uns leicht erleichtert, die Datenbank zu transformieren. Um es auszuwählen.
Das Gleiche gilt natürlich auch in Java, außer dass die Konfigurationsdatei hier. Lesen Sie den Inhalt durch Reflexion durch. Auf diese Weise wird der Code behoben, aber wir können den Inhalt der Konfigurationsdatei ändern, wodurch unser Code viel flexibler wird!
Zusammenfassend lässt sich sagen sorgfältig.
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.