Was ist Java-Reflektion?
Reflection ist eine der Funktionen von Java und ein Mechanismus zum indirekten Bedienen von Zielobjekten.
Der JAVA-Reflexionsmechanismus befindet sich im laufenden Zustand. Sie können alle Eigenschaften und Methoden dieser Klasse kennen und jede ihrer Methoden und Eigenschaften aufrufen dynamisch Die Funktion zum Abrufen von Informationen und zum dynamischen Aufrufen von Objektmethoden wird als Reflexionsmechanismus der Java-Sprache bezeichnet.
Warum ist Reflexion in Java erforderlich? Welches Problem löst Reflexion?
In einem Satz kann Reflexion verwendet werden, um JVM die Möglichkeit zu geben, dynamisch zu kompilieren. Andernfalls können die Metadateninformationen der Klasse nur durch statische Kompilierung erreicht werden, z Hot Loading, Tomcats Classloader usw. können nicht unterstützt werden
Es gibt zwei Arten der Kompilierung in Java:
● Statische Kompilierung: Der Typ wird zur Kompilierungszeit bestimmt und das gebundene Objekt ist bestanden.
● Dynamische Kompilierung: Bestimmen Sie den Typ und binden Sie das Objekt zur Laufzeit. Die dynamische Kompilierung maximiert die Flexibilität von Java, verkörpert polymorphe Anwendungen und kann die Kopplung zwischen Klassen reduzieren.
Java-Reflexion ist eine Schlüsseleigenschaft von Java, das als dynamische (oder quasi-dynamische) Sprache betrachtet wird. Dieser Mechanismus ermöglicht es dem Programm, zur Laufzeit die internen Informationen jeder Klasse mit einem bekannten Namen über die Reflection-APIs abzurufen, einschließlich ihrer Modifikatoren (z. B. öffentlich, statisch usw.), ihrer Superklasse (z. B. Objekt) und implementierten Schnittstellen (z. B Klonbar) und alle Informationen zu Feldern und Methoden und kann den Inhalt von Feldern ändern oder Methoden zur Laufzeit aufrufen.
Reflection kann Klassen laden, erkennen und verwenden, die während der Kompilierung zur Laufzeit völlig unbekannt sind. Das heißt, ein Java-Programm kann eine Klasse laden, deren Name nur zur Laufzeit bekannt ist, ihre vollständige Struktur abrufen und ihre Objektentität generieren oder Werte für ihre Felder festlegen oder ihre Methoden aufrufen.
Reflection ermöglicht es statischen Sprachen, die Struktur und das Verhalten des Programms zur Laufzeit zu überprüfen und zu ändern.
Wenn Sie in statischen Sprachen eine Variable verwenden, müssen Sie deren Typ kennen. In Java werden die Typinformationen von Variablen während der Kompilierung in der Klassendatei gespeichert, sodass sie zur Laufzeit korrekt sind. Mit anderen Worten: Das Verhalten des Programms zur Laufzeit ist festgelegt. Wenn Sie es zur Laufzeit ändern möchten, ist Reflexion erforderlich.
Die Klassen, die den Java-Reflexionsmechanismus implementieren, befinden sich alle im Paket java.lang.reflect:
1. Klassenklasse: stellt eine Klasse dar
2 : repräsentiert die Klassenmitgliedsvariablen (Attribute der Klasse)
3. Methodenklasse: repräsentiert die Methode der Klasse
4
5. Array-Klasse: Bietet die Möglichkeit, dynamisch ein Array zu erstellen und auf statische Methoden von Array-Elementen zuzugreifen.verwenden Sie
Drei Möglichkeiten, Klassenobjekte zu erhalten
1.1 Objekt ——> getClass();1.2 Alle Daten Typ (einschließlich grundlegender Datentypen) Es gibt ein „statisches“ Klassenattribut
1.3 Über die statische Methode der Klassenklasse: forName (String className) (häufig verwendet)
/** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 * 3 通过Class类的静态方法:forName(String className)(常用) * */ public class Fanshe { public static void main(String[] args) { //第一种方式获取Class对象 Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。 Class stuClass = stu1.getClass();//获取Class对象 System.out.println(stuClass.getName()); //第二种方式获取Class对象 Class stuClass2 = Student.class; System.out.println(stuClass == stuClass2); //判断第一种方式获取的Class对象和第二种方式获取的是否是同一个 //第三种方式获取Class对象 try { Class stuClass3 = Class.forName("fanshe.Student"); //注意此字符串必须是真实路径,就是带包名的类路径,包名.类名 System.out.println(stuClass3 == stuClass2); //判断三种方式是否获取的是同一个Class对象 } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("*****************获取公有、无参的构造方法*************"); Constructor con = clazz.getConstructor(null); //1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型 //2>、返回的是描述这个无参构造函数的类对象。 System.out.println("*************获取公有字段**并调用*****************"); Field f = stuClass.getField("name"); System.out.println(f); System.out.println("***************获取私有的show4()方法******************"); m = stuClass.getDeclaredMethod("show4", int.class); System.out.println(m); m.setAccessible(true);//解除私有限定 Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参 System.out.println("返回值:" + result); } }
Das obige ist der detaillierte Inhalt vonWelche Reflexion ist Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!