Dieser Artikel enthält hauptsächlich relevante Informationen zur detaillierten Erläuterung von Beispielen für Java-Reflexionsmechanismen. Hier finden Sie eine detaillierte Analyse des Reflexionsmechanismus in Java.
Detaillierte Erläuterungen zu Java Beispiele für Reflexionsmechanismen.
1. Ist JAVA eine dynamische Sprache?
Im Allgemeinen bedeutet dies, dass bei dynamischen Sprachen die Programmstruktur oder der Variablentyp geändert werden darf, während das Programm ausgeführt wird. Aus dieser Sicht gilt Java wie C++. ist keine dynamische Sprache.
Aber JAVA verfügt über einen sehr wichtigen dynamischen Mechanismus: Reflexion. Durch Reflektion kann Java Klassen laden, erkennen und verwenden, die während der Kompilierung zur Laufzeit vollständig summiert wurden, ihre Objektentitäten generieren, ihre Methoden aufrufen oder Werte für Eigenschaften festlegen. Daher gilt Java als semidynamische Sprache.
Das Konzept der Reflexion:
Der Reflexionsmechanismus in Java bedeutet, dass im laufenden Zustand für jede Klasse alle Eigenschaften und Methoden dieser Klasse bekannt sein können;
Für jedes Objekt können Sie jede seiner Methoden aufrufen;
Diese Funktion zum dynamischen Abrufen von Informationen und zum dynamischen Aufrufen von Objektmethoden wird als Reflexionsmechanismus der Java-Sprache bezeichnet
II , Dynamisch Eigenschaften
2.1, Dynamische Eigenschaften
Objektinstanzen zur Laufzeit generieren;
Methoden zur Laufzeit aufrufen;
Attribute zur Laufzeit ändern
2.2. Funktionen, die der Java-Reflexionsmechanismus erreichen kann
Bestimmen Sie die Klasse, zu der ein Objekt zur Laufzeit gehört.
Erstellen Sie zur Laufzeit ein beliebiges Objekt
bestimmt die Methoden und Attribute einer beliebigen Klasse zur Laufzeit
ruft die Methode eines beliebigen Objekts zur Laufzeit auf
generiert einen dynamischen Proxy
2.3 Java-Reflection-Anwendungsszenarien
Viele Objekte in Java-Programmen haben zur Laufzeit zwei Typen: Typ zur Kompilierungszeit und Typ zur Laufzeit
Der Typ zur Kompilierungszeit wird durch den Zeitpunkt bestimmt, zu dem das Objekt deklariert wird Der verwendete Typ wird durch den Typ bestimmt, der zur Laufzeit dem Objekt tatsächlich zugewiesen ist.
Zum Beispiel:
Person p =new Student();
Der Typ zur Kompilierungszeit ist Person und die Laufzeit ist Student
Darüber hinaus kann das Programm während der Laufzeit auch ein von außen übergebenes Objekt empfangen. Der Typ zur Kompilierungszeit des Objekts ist Objekt, aber das Programm muss den Laufzeittyp der Objektmethode aufrufen. Um diese Probleme zu lösen, müssen Programme zur Laufzeit echte Informationen über Objekte und Klassen ermitteln. Wenn es jedoch zur Kompilierungszeit unmöglich ist, vorherzusagen, zu welchen Klassen das Objekt und die Klasse gehören könnten, und das Programm nur auf Laufzeitinformationen angewiesen ist, um die tatsächlichen Informationen des Objekts und der Klasse zu ermitteln, muss zu diesem Zeitpunkt Reflektion verwendet werden
3. Java Reflection API
Reflection API wird verwendet, um Informationen über Klassen, Schnittstellen oder Objekte in der aktuellen JAVA Virtual Machine zu generieren.
Klassenklasse: Die Kernklasse der Reflexion, die die Attribute, Methoden und andere Inhaltsinformationen der Klasse abrufen kann.
Feldklasse: Java.lang.reflect Stellt die Attribute der Klasse dar und kann die Attributwerte der Klasse abrufen und festlegen.
Methodenklasse: Java.lang.reflect. Stellt eine Methode einer Klasse dar, die verwendet werden kann, um Informationen über Methoden in einer Klasse abzurufen oder Methoden auszuführen
Konstruktorklasse: Java.lang.reflect. Stellt die Konstruktormethode der Klasse dar.
4. Alle Methoden und Attribute abrufen
Personenklasse
package com.pb.Reflect.classinfo; public class Person { private String name; private String gender; private int age; private Person() { // } public Person(String name, String gender, int age) { super(); this.name = name; this.gender = gender; this.age = age; } //getter、和setter方法 private String getName() { return name; } private void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "姓名:"+name+"年龄: "+age; } }
Reflexion verwenden :
package com.pb.Reflect.classinfo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.swing.JOptionPane; /* * 通过用户输入类的全路径,来获取该类的成员方法和属性 * Declared获取全部不管是私有和公有 * 1.获取访问类的Class对象 * 2.调用Class对象的方法返回访问类的方法和属性信息 */ public class ReflectDemo { /* * 构造方法 */ public ReflectDemo(){ //用户输入类的全路径径 //使用String组件 String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径"); //使用Class.forName方法根据输入的类的全路径 返回该类的Class对象 try { Class cla = Class.forName(classpsth); //利用Class对象的cla的自审,返回方法对象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========获取方法信息============"); for (Method meth : method) { //遍历method数组,并输出方法信息 System.out.println(meth.toString()); } System.out.println("========获取出方法信息结束============"); //获取属性利用Class对象的cla的自审,返回成员属性对象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========获取成员属性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========获取成员属性信息结束============"); //获取属性利用Class对象的cla的自审,返回构造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========获取成员构造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========获取成员构造方法信息结束============"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("路径输入错误!"); } } }
package com.pb.Reflect.classinfo; public class TestReflection { public static void main(String[] args) { ReflectDemo rd=new ReflectDemo(); } }
Geben Sie com.pb.Reflect.classinfo.Person ein
Ergebnis:
========获取方法信息============ public java.lang.String com.pb.Reflect.classinfo.Person.getGender() public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String) public int com.pb.Reflect.classinfo.Person.getAge() public void com.pb.Reflect.classinfo.Person.setAge(int) public java.lang.String com.pb.Reflect.classinfo.Person.toString() private java.lang.String com.pb.Reflect.classinfo.Person.getName() private void com.pb.Reflect.classinfo.Person.setName(java.lang.String) ========获取出方法信息结束============ ========获取成员属性信息============ private java.lang.String com.pb.Reflect.classinfo.Person.name private java.lang.String com.pb.Reflect.classinfo.Person.gender private int com.pb.Reflect.classinfo.Person.age ========获取成员属性信息结束============ ========获取构造方法信息============ private com.pb.Reflect.classinfo.Person() public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int) ========获取构造方法信息结束============
Schritte zur Verwendung von Reflektion
Schritte
Java.lang.reflect
Rufen Sie das Java.lang.Class-Objekt der Klasse ab, die Sie bedienen möchten
Rufen Sie die Methode von Class auf
Verwenden Sie die Reflection-API, um diese Informationen zu bedienen
5.2. So erhalten Sie das Class-Objekt
Rufen Sie die getClass()-Methode eines Objekts auf
Person p = new Person(); Class cla=p.getClass();
Rufen Sie das Klassenattribut einer Klasse auf. Um das der Klasse entsprechende Klassenobjekt zu erhalten
Class cls=Person.class;
Verwenden Sie die statische Methode forName() der Klassenklasse
Class cla=Class.forName(“类的全路径”);
6. Die getClass()-Methode des zweiten Methodenobjekts
Personenklasse, weil das Objekt deklariert werden soll, ist die Konstruktormethode öffentlich
package com.pb.Reflect.classinfo; public class Person { private String name; private String gender; private int age; public Person() { // } public Person(String name, String gender, int age) { super(); this.name = name; this.gender = gender; this.age = age; } //getter、和setter方法 private String getName() { return name; } private void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "姓名:"+name+"年龄: "+age; } }
Reflection verwenden:
package com.pb.Reflect.classinfo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.swing.JOptionPane; /* * 通过用户输入类的全路径,来获取该类的成员方法和属性 * Declared获取全部不管是私有和公有 * 1.获取访问类的Class对象 * 2.调用Class对象的方法返回访问类的方法和属性信息 */ public ReflectDemo(Person p){ Class cla=p.getClass(); //利用Class对象的cla的自审,返回方法对象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========获取方法信息============"); for (Method meth : method) { //遍历method数组,并输出方法信息 System.out.println(meth.toString()); } System.out.println("========获取出方法信息结束============"); //获取属性利用Class对象的cla的自审,返回成员属性对象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========获取成员属性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========获取成员属性信息结束============"); //获取属性利用Class对象的cla的自审,返回构造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========获取成员构造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========获取成员构造方法信息结束============"); } }
Test Klasse
package com.pb.Reflect.classinfo; public class TestReflection { public static void main(String[] args) { Person p=new Person(); ReflectDemo rd=new ReflectDemo(p); } }
========获取方法信息============ public java.lang.String com.pb.Reflect.classinfo.Person.getGender() public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String) public int com.pb.Reflect.classinfo.Person.getAge() public void com.pb.Reflect.classinfo.Person.setAge(int) public java.lang.String com.pb.Reflect.classinfo.Person.toString() private java.lang.String com.pb.Reflect.classinfo.Person.getName() private void com.pb.Reflect.classinfo.Person.setName(java.lang.String) ========获取出方法信息结束============ ========获取成员属性信息============ private java.lang.String com.pb.Reflect.classinfo.Person.name private java.lang.String com.pb.Reflect.classinfo.Person.gender private int com.pb.Reflect.classinfo.Person.age ========获取成员属性信息结束============ ========获取成员构造方法信息============ public com.pb.Reflect.classinfo.Person() public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int) ========获取成员构造方法信息结束============
7. Das .class-Attribut der dritten Methodenklasse
Personenklasse ist die gleiche wie oben
Testklasse:
package com.pb.Reflect.classinfo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflection { public static void main(String[] args) { /*第二种方法 Person p=new Person(); ReflectDemo rd=new ReflectDemo(p); */ /* * 第三种方式.class属性 */ Class cla=Person.class; //利用Class对象的cla的自审,返回方法对象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========获取方法信息============"); for (Method meth : method) { //遍历method数组,并输出方法信息 System.out.println(meth.toString()); } System.out.println("========获取出方法信息结束============"); //获取属性利用Class对象的cla的自审,返回成员属性对象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========获取成员属性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========获取成员属性信息结束============"); //获取属性利用Class对象的cla的自审,返回构造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========获取成员构造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========获取成员构造方法信息结束============"); } }
Ergebnis:
Gleiche wie oben
========获取方法信息============ public java.lang.String com.pb.Reflect.classinfo.Person.getGender() public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String) public int com.pb.Reflect.classinfo.Person.getAge() public void com.pb.Reflect.classinfo.Person.setAge(int) public java.lang.String com.pb.Reflect.classinfo.Person.toString() private java.lang.String com.pb.Reflect.classinfo.Person.getName() private void com.pb.Reflect.classinfo.Person.setName(java.lang.String) ========获取出方法信息结束============ ========获取成员属性信息============ private java.lang.String com.pb.Reflect.classinfo.Person.name private java.lang.String com.pb.Reflect.classinfo.Person.gender private int com.pb.Reflect.classinfo.Person.age ========获取成员属性信息结束============ ========获取成员构造方法信息============ public com.pb.Reflect.classinfo.Person() public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int) ========获取成员构造方法信息结束============
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für Reflexionsmechanismen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!