Java-Reflexion ist ein Prozess der Untersuchung oder Änderung des Laufzeitverhaltens einer Klasse zur Laufzeit .
Der java.lang.Class Die Klasse bietet viele Methoden, mit denen Metadaten abgerufen und das Laufzeitverhalten einer Klasse untersucht und geändert werden können.
Die Pakete java.lang und java.lang.reflect stellen Klassen für die Java-Reflektion bereit.
Wo es verwendet wird
Die Reflection API wird hauptsächlich verwendet in:
ungültig 0
- IDE (Integrated Development Environment), z. B. Eclipse, MyEclipse, NetBeans usw.
- Debugger
- Testtools usw.
- Auf wie viele Arten können wir die Instanz der Klassenklasse erhalten?
- Wie erstelle ich das Javap-Tool?
- Wie erstelle ich das Appletviewer-Tool?
- Wie greife ich von außerhalb der Klasse auf die private Methode zu?
java.lang.Class-Klasse
Die Klasse java.lang.Class führt hauptsächlich zwei Aufgaben aus:
- stellt Methoden bereit, um die Metadaten einer Klasse zur Laufzeit abzurufen.
- stellt Methoden zur Untersuchung und Änderung des Laufzeitverhaltens einer Klasse bereit.
Häufig verwendete Methoden der Klassenklasse:
Methode | Beschreibung |
---|---|
1) öffentlicher String getName() | gibt den Klassennamen zurück |
2) Die öffentliche statische Klasse forName (String className) löst eine ClassNotFoundException aus | lädt die Klasse und gibt die Referenz der Klassenklasse zurück. |
3) öffentliches Objekt newInstance() löst InstantiationException, IllegalAccessException aus | Erstellt eine neue Instanz. |
4) öffentlicher boolescher Wert isInterface() | prüft, ob es sich um eine Schnittstelle handelt. |
5) öffentlicher boolescher Wert isArray(); | prüft, ob es sich um ein Array handelt. |
6) öffentlicher boolescher Wert isPrimitive() | prüft, ob es primitiv ist. |
7) öffentliche Klasse getSuperclass() | gibt die Klassenreferenz der Oberklasse zurück. |
8) öffentliches Feld[] getDeclaredFields() löst eine SecurityException aus | gibt die Gesamtzahl der Felder dieser Klasse zurück. |
9) öffentliche Methode[] getDeclaredMethods() löst eine SecurityException aus | gibt die Gesamtzahl der Methoden dieser Klasse zurück. |
10) public Constructor[] getDeclaredConstructors() löst eine SecurityException aus | gibt die Gesamtzahl der Konstruktoren dieser Klasse zurück. |
11) Die öffentliche Methode getDeclaredMethod(String name,Class[] parameterTypes) löst NoSuchMethodException,SecurityException aus | gibt die Instanz der Methodenklasse zurück. |
Wie erhalte ich das Objekt der Klasse class?
Es gibt drei Möglichkeiten, die Instanz der Class-Klasse abzurufen. Sie sind wie folgt:
- forName()-Methode der Class-Klasse
- getClass()-Methode der Object-Klasse
- die .class-Syntax
1) forName()-Methode der Class-Klasse
- wird verwendet, um die Klasse dynamisch zu laden.
- gibt die Instanz der Klasse Klasse zurück.
- Es sollte verwendet werden, wenn Sie den vollständig qualifizierten Namen der Klasse kennen. Dies kann nicht für primitive Typen verwendet werden.
Sehen wir uns das einfache Beispiel der forName()-Methode an.
Dateiname: Test.java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Ausgabe:
Simple
2) getClass()-Methode der Object-Klasse
Es gibt die Instanz der Klasse Klasse zurück. Es sollte verwendet werden, wenn Sie den Typ kennen. Darüber hinaus kann es mit Grundelementen verwendet werden.
Dateiname: Test.java
class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } }
Ausgabe:
Simple
3) Die .class-Syntax
Wenn ein Typ verfügbar ist, aber keine Instanz vorhanden ist, können Sie eine Klasse erhalten, indem Sie „.class“ an den Namen des Typs anhängen. Es kann auch für primitive Datentypen verwendet werden.
Dateiname: Test.java
class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } }
Ausgabe:
boolean Test
Bestimmen des Klassenobjekts
Zur Bestimmung des Klassenobjekts werden die folgenden Methoden der Klassenklasse verwendet:
1) öffentlicher boolescher Wert isInterface(): Bestimmt, ob das angegebene Klassenobjekt einen Schnittstellentyp darstellt.
Löschen aus einem binären Suchbaum
2) öffentlicher boolescher Wert isArray(): bestimmt, ob dieses Klassenobjekt eine Array-Klasse darstellt.
3) öffentlicher boolescher Wert isPrimitive(): Bestimmt, ob das angegebene Klassenobjekt einen primitiven Typ darstellt.
Sehen wir uns das einfache Beispiel der Reflection-API zur Bestimmung des Objekttyps an.
Dateiname: Test.java
class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } }
Ausgabe:
false true
Vor- und Nachteile der Reflexion
Java Reflection sollte immer mit Vorsicht verwendet werden. Die Reflexion bietet zwar viele Vorteile, hat aber auch einige Nachteile. Lassen Sie uns zunächst die Vorteile besprechen.
Vorteile: Die Überprüfung von Schnittstellen, Klassen, Methoden und Feldern während der Laufzeit ist mithilfe der Reflektion möglich, auch ohne deren Namen während der Kompilierungszeit zu verwenden. Es ist auch möglich, Methoden aufzurufen, einen Clear zu instanziieren oder den Wert von Feldern mithilfe von Reflektion festzulegen. Es hilft bei der Erstellung von visuellen Entwicklungsumgebungen und Klassenbrowsern und bietet Entwicklern Hilfe beim Schreiben des richtigen Codes.
Nachteile: Durch Reflexion kann man die Prinzipien der Kapselung durchbrechen. Es ist möglich, mithilfe von Reflektion auf die privaten Methoden und Felder einer Klasse zuzugreifen. Daher kann die Reflexion wichtige Daten an die Außenwelt weitergeben, was gefährlich ist. Wenn beispielsweise jemand auf die privaten Mitglieder einer Klasse zugreift und für diese einen Nullwert festlegt, kann der andere Benutzer derselben Klasse die NullReferenceException erhalten, und dieses Verhalten ist nicht zu erwarten.
Ein weiterer Nachteil ist der Mehraufwand bei der Leistung. Da die reflektierten Typen dynamisch aufgelöst werden, kann eine JVM-Optimierung (Java Virtual Machine) nicht stattfinden. Daher sind die von Reflexionen ausgeführten Vorgänge normalerweise langsam.
Abschluss
Aufgrund der oben genannten Nachteile ist es generell ratsam, auf den Einsatz von Reflektion zu verzichten. Es handelt sich um eine erweiterte Funktion, die nur von Programmierern oder Entwicklern verwendet werden sollte, die über gute Kenntnisse der Grundlagen der Sprache verfügen. Immer daran denken! Immer wenn Reflektion verwendet wird, ist die Sicherheit der Anwendung gefährdet.
Filmschauspielerin Kajal
Nächste Themen des Reflection-API-Tutorials
newInstance()-MethodeJavap-Tool verstehen
Javap-Tool erstellen
Erstellen eines Appletviewer-Tools
Rufen Sie eine private Methode einer anderen Klasse auf