1. Ist JAVA eine dynamische Sprache?
Im Allgemeinen bedeutet dies bei dynamischen Sprachen, dass die Programmstruktur oder der Variablentyp geändert werden darf, während das Programm ausgeführt wird. Aus dieser Sicht ist JAVA wie C++ kein Problem 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 , Sie können alle Attribute und Methoden dieser Klasse kennen;
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
●Attribute zur Laufzeit ändern
● Bestimmen Sie die Methoden und Attribute einer beliebigen Klasse zur Laufzeit
●Aufruf die Methode eines beliebigen Objekts zur Laufzeit
●Generieren Sie einen dynamischen Proxy
2.3. Java-Reflexionsanwendungsszenarien
Viele Objekte in Java-Programmen werden Es gibt zwei Typen: Typ zur Kompilierungszeit und Laufzeittyp
Der Kompilierungszeittyp wird durch den Typ bestimmt, der beim Deklarieren des Objekts verwendet wird, und der Laufzeittyp wird durch den Typ bestimmt, der dem Objekt tatsächlich zugewiesen ist
Für Beispiel:
Der Kompilierzeittyp ist Person und der Laufzeittyp ist StudentDarüber hinaus kann das Programm während der Laufzeit auch ein von außen übergebenes Objekt empfangen Der Typ zur Kompilierungszeit ist Object, aber das Programm muss die Methode des Laufzeittyps des Objekts 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 werden3. Java Reflection API
Person p =new Student();
●Feldklasse: Java.lang.reflect Repräsentiert die Attribute von die Klasse, die abgerufen und festgelegt werden kann Der Attributwert der Klasse.
●Methodenklasse: Java.lang.reflect. Stellt eine Klassenmethode dar, die verwendet werden kann, um Informationen über Methoden in der Klasse abzurufen oder Methoden auszuführen.
Konstruktorklasse: Java.lang.reflect. Stellt die Konstruktormethode der Klasse dar.
4. Alle Methoden und Attribute abrufen
PersonenklasseReflexion verwenden:
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; } }
Ergebnis:
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(); } }