Die Fähigkeit, Elemente wie Klassen, Methoden, Eigenschaften usw. dynamisch abzurufen und zu bearbeiten, während ein Java-Programm ausgeführt wird, wird als Java-Reflektion bezeichnet. Es ermöglicht uns, Informationen über eine Klasse zu erhalten und diese zu bearbeiten, während das Programm ausgeführt wird, was die Flexibilität und Skalierbarkeit der Java-Sprache erheblich erweitert.
In Java verfügt jede Klasse über ein entsprechendes Klassenobjekt, und die Reflexion verwendet dieses Klassenobjekt, um Klasseninformationen abzurufen und zu verarbeiten.
In Java gibt es drei Möglichkeiten, das Klassenobjekt abzurufen:
Dies ist die gebräuchlichste Methode. Verwenden Sie dazu die Methode Class.forName() Holen Sie sich das Klassenobjekt. Zum Beispiel:
Class<?> clazz = Class.forName("com.example.MyClass");
Sie können das Klassenobjekt, zu dem es gehört, über die Methode getClass() des Objekts abrufen. Zum Beispiel:
MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
Verwenden Sie die Klassenliteralkonstante, um Klassenobjekte abzurufen, zum Beispiel:
Class<?> clazz = MyClass.class;
Durch Abrufen des Klassenobjekts können wir verschiedene Informationen über die Klasse erhalten. wie Klassenname, geerbte Klasse, implementierte Schnittstelle, Konstruktor, Methoden und Felder usw. Das Folgende ist ein Beispiel für das Abrufen der Felder einer Klasse.
Sie können alle öffentlichen geänderten Felder über die getFields()-Methode des Klassenobjekts abrufen, zum Beispiel:
Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field.getName()); }
Sie können die öffentliche Änderung des angegebenen Namens über abrufen die getField()-Methode der Klassenobjektfelder, zum Beispiel:
Field field = clazz.getField("name"); System.out.println(field.getName());
Sie können alle deklarierten Felder über die getDeclaredFields()-Methode des Klassenobjekts abrufen, einschließlich öffentlicher, geschützter und privater geänderter Felder. zum Beispiel:
Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println(field.getName()); }
Sie können die deklarierten Felder mit dem angegebenen Namen über die Methode getDeclaredField() des Klassenobjekts abrufen, einschließlich der durch öffentliche, geschützte und private geänderten Felder, zum Beispiel:
Field field = clazz.getDeclaredField("name"); System.out.println(field.getName());
Sobald wir die Klasseninformationen erhalten haben, können wir Reflektion verwenden, um Klassen und Objekte zu manipulieren, z. B. Objekte zu erstellen, Methoden aufzurufen und auf Eigenschaften zuzugreifen. Im Folgenden finden Sie ein Beispiel für die Erstellung von Objekten und den Zugriff auf Eigenschaften.
Sie können Objekte über die newInstance()-Methode des Klassenobjekts erstellen, zum Beispiel:
MyClass obj = (MyClass) clazz.newInstance();
Sie können durch Reflektion auf die Eigenschaften des Objekts zugreifen, einschließlich des Abrufens und Festlegens von Eigenschaftswerten . Beispiel:
Field field = clazz.getDeclaredField("name"); field.setAccessible(true); field.set(obj, "张三"); String name = (String) field.get(obj);
Der obige Code ruft zuerst das Namensattribut der Klasse ab und legt es so fest, dass darauf zugegriffen werden kann, setzt dann den Attributwert durch Reflektion auf „Zhang San“ und ruft schließlich den Attributwert ab und weist ihn der Namensvariablen zu .
Reflektion wird häufig in Java verwendet:
Abhängigkeitsinjektion ist eine Methode zum dynamischen Einfügen von Abhängigkeiten in eine Klasse durch Reflexion. Beispielsweise wird die Abhängigkeitsinjektion im Spring-Framework durch Reflektion implementiert.
In Java können Konfigurationsdateien wie XML und JSON durch Reflektion analysiert und die Daten in der Konfigurationsdatei in Java-Objekte konvertiert werden.
Dynamischer Proxy ist eine Methode zum Generieren von Proxy-Klassen durch Reflektion. Dynamische Proxys ermöglichen die Generierung von Proxy-Objekten zur Laufzeit, um Zielobjekte zu erweitern oder abzufangen.
Die Flexibilität und Skalierbarkeit von Java kann durch dynamisches Abrufen und Bearbeiten von Klasseninformationen zur Laufzeit erreicht werden, was den Vorteil der Reflexion darstellt. Reflection kann einige Funktionen realisieren, die mit herkömmlichen Methoden nicht erreicht werden können, z. B. dynamischer Proxy, Abhängigkeitsinjektion usw.
Aufgrund der Notwendigkeit, Klasseninformationen zur Laufzeit dynamisch abzurufen und zu verarbeiten, ist die Leistung von Reflexionsoperationen normalerweise schlechter als die direkte Operation von Klassen, was einen Mangel an Reflexion darstellt. Die Verwendung von Reflektion verringert die Lesbarkeit des Codes, da Code, der die Methoden eines Objekts aufruft oder auf Eigenschaften zugreift, normalerweise einfacher und klarer ist als Code, der Reflektion verwendet.
Das obige ist der detaillierte Inhalt vonSo definieren und verwenden Sie Java Reflection. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!