English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dieser Artikel beschreibt den Gebrauch der Reflection-Mechanismen in Java. Hiermit teilen wir mit, um alle zu beraten, wie folgt:
Einleitung:Reflection: Dynamische Abrufung von Klassen (Bytecode-Dateien wie dem Person.class in diesem Artikel) und die Ausführung ihrer Member. Reflection tritt in der Entwicklung von Android-Anwendungen möglicherweise etwas seltener auf, aber für Freunde der Unterlage ist es unbedingt erforderlich, sie beherrschen und anwenden zu lernen.
实体类
Person.java
package com.sunwenou.reflect;// 包名 public class Person { private String name; private int age; public Person() {// 无参 } public Person(String name, int age) {// Mit Parameter super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name+","+age; } public void show() { // Kein Parameter System.out.println("show"); } public void fun(String ss) { // Mit Parameter System.out.println(ss); } public static void function() { // Statisch System.out.println("static"); } }
Dynamische Methode zur Ermittlung der Bytecode-Datei
In diesem Artikel wird die Klarheit des Beitrags gewährleistet, indem alle Exception geworfen werden und die Import-Ausnahmen weggelassen werden, wie oben beschrieben.
package com.sunwenou.reflect; public class Demo1 { /** * Dynamische Methode zur Ermittlung der Bytecode-Datei * 1:Verwenden Sie die von Object bereitgestellte Methode Class getClass() * Diese Methode erfordert ein Objekt * 2:Jeder Datentyp hat eine statische class-Eigenschaft, diese Eigenschaft gibt das Bytecode-Objekt dieses Datentyps zurück * int.class Person.class * 3:Verwenden Sie die von Class bereitgestellte Methode forName() * Es ist ausreichend, eine Zeichenfolge bereitzustellen, die aus dem+Klassenname Bestand */ public static void main(String[] args) throws Exception { //getClaz(); //getCalz2() getClaz3() } //Verwenden Sie die von Class bereitgestellte Methode forName() public static void getClaz3() throws Exception { Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person"); System.out.println(claz==claz2) } //Jeder Datentyp hat eine statische class-Eigenschaft public static void getCalz2() { Class<Person> p1 = Person.class; Class<Person> p2 = Person.class; System.out.println(p1==p2) } //Verwenden Sie die von der Object-Klasse bereitgestellte Methode Class getClass() public static void getClaz() { Person person1 = new Person(); Class<? extends Person> claz = person1.getClass();//Person.class Person person2 = new Person(); Class<? extends Person> claz2 = person2.getClass();//Person.class System.out.println(claz==claz2) } }
Dynamisch Klasse ermitteln und Objekt erstellen
package com.sunwenou.reflect; public class Demo2 { public static void main(String[] args) throws Exception { //createObj(); createObj2() } public static void createObj2() throws Exception { //Person person = new Person("lisi",23) //Bytecode-Datei-Objekt erhalten Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class //得到带参数的构造方法所属的Constructor类型的对象 Constructor constructor = claz.getConstructor(String.class,int.class); //使用Constructor类提供的创建对象的方法创建对象 Person person = (Person)constructor.newInstance("lisi",23) System.out.println(person); } public static void createObj() throws Exception { //Person person = new Person(); //Bytecode-Datei-Objekt erhalten Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Object obj = claz.newInstance();//默认使用空参的构造方法创建对象 System.out.println(obj); } }
动态获取类并为成员变量赋值
package com.sunwenou.reflect; public class Demo3 { public static void main(String[] args) throws Exception { //Person p = new Person(); //p.name = "lisi"; //Bytecode-Datei-Objekt erhalten Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //得到成员变量所属的Field类型的对象 //Field field = claz.getField("name");//得到的是public权限的成员 Field field = claz.getDeclaredField("name");//得到所有声明的字段 System.out.println(field); //非静态成员变量是依赖于对象的 Object obj = claz.newInstance(); field.setAccessible(true);//暴力破解, 设置为可访问的 field.set(obj, "张三"); System.out.println(obj); } }
动态获取类,并执行方法
package com.sunwenou.reflect; public class Demo4 { public static void main(String[] args) throws Exception { //method1() method2() method3() } public static void method3() throws Exception { //Bytecode-Datei-Objekt erhalten Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("function", null); m.invoke(null, null); } ////执行带参数的方法 public static void method2() throws Exception { //Bytecode-Datei-Objekt erhalten Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("fun", String.class); Object obj = claz.newInstance(); m.invoke(obj, "hello"); } //Unparametrierte Methode ausführen public static void method1() throws Exception { //Person person = new Person(); person.show(); //Bytecode-Datei-Objekt erhalten Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //Objekt erhalten, das die Bytecode-Datei des auszuführenden Methods enthält Method m = claz.getMethod("show", null); //Nicht-statische Methoden sind auf das Objekt angewiesen Object obj = claz.newInstance(); //Methode ausführen m.invoke(obj, null); } }
Das ist die grundlegende Verwendung von Reflection. Wir können Objekte durch die Bytecode-Datei des Objekts erstellen, wenn wir nicht auf normalem Wege Objekte erstellen können, und Methoden ausführen, die darin enthalten sind. Haben Sie gelernt??
Interessierte Leser, die mehr über Java-Themen erfahren möchten, können die Themenbereiche dieser Website besuchen: 'Einführung und Fortgeschrittene Anleitung zur objektorientierten Programmierung in Java', 'Anleitung zur Datenstruktur und Algorithmen in Java', 'Zusammenfassung der Techniken zur Manipulation von DOM-Nodes in Java', 'Zusammenfassung der Techniken zur Manipulation von Dateien und Verzeichnissen in Java' und 'Zusammenfassung der Techniken zur Manipulation von Caches in Java'.
Ich hoffe, dass die in diesem Artikel beschriebenen Inhalte für Ihre Java-Programmgestaltung hilfreich sein werden.
Erklärung: Der Inhalt dieses Artikels stammt aus dem Internet und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte, hat den Inhalt nicht manuell bearbeitet und trägt keine rechtlichen Verantwortlichkeiten. Falls Sie Inhalte finden, die möglicherweise Urheberrechtsverletzungen darstellen, freuen wir uns über eine E-Mail an: notice#w3Erklärung: Der Inhalt dieses Artikels stammt aus dem Internet und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte, hat den Inhalt nicht manuell bearbeitet und trägt keine rechtlichen Verantwortlichkeiten. Falls Sie Inhalte finden, die möglicherweise Urheberrechtsverletzungen darstellen, freuen wir uns über eine E-Mail an: notice#w