1. JAVA est-il un langage dynamique ?
De manière générale, lorsqu'on parle de langages dynamiques, cela signifie que la structure du programme ou le type de variable peut être modifié pendant l'exécution du programme. De ce point de vue, JAVA, comme C, n'est pas un langage dynamique. langue.
Mais JAVA possède un mécanisme dynamique associé très important : la réflexion. Grâce à la réflexion, Java peut charger, détecter et utiliser des classes entièrement additionnées lors de la compilation au moment de l'exécution, générer leurs entités d'objet, appeler leurs méthodes ou définir des valeurs pour les propriétés. Java est donc considéré comme un langage semi-dynamique.
Le concept de réflexion :
Le mécanisme de réflexion en Java signifie qu'à l'état d'exécution, pour toute classe , vous pouvez connaître tous les attributs et méthodes de cette classe
Pour n'importe quel objet, vous pouvez appeler n'importe laquelle de ses méthodes ; 🎜>
Cette fonction d'obtention dynamique d'informations et d'appel dynamique de méthodes objet est appelée mécanisme de réflexion du langage Java
.
● Appeler des méthodes pendant l'exécution
● Modifier les attributs au moment de l'exécution
2.2 Fonctions que le mécanisme de réflexion Java peut réaliser
● Construire un objet de n'importe quelle classe au moment de l'exécution
● Déterminer les méthodes et les attributs de n'importe quelle classe au moment de l'exécution
● Appeler la méthode de n'importe quel objet au moment de l'exécution
QuantityGénérer un proxy dynamique
2.3. Scénarios d'application de réflexion Java
De nombreux objets dans les programmes Java seront de deux types : et type d'exécution
Le type de compilation est déterminé par le type utilisé lors de la déclaration de l'objet, et le type d'exécution est déterminé par le type réellement attribué à l'objet
Pour exemple :
Le type de compilation est Personne et le type d'exécution est ÉtudiantDe plus, le programme peut également recevoir un objet transmis de l'extérieur pendant l'exécution . Le type de compilation est Object, mais le programme doit appeler la méthode du type d'exécution de l'objet. Pour résoudre ces problèmes, les programmes doivent découvrir des informations réelles sur les objets et les classes au moment de l'exécution. Cependant, s'il est impossible de prédire à quelles classes l'objet et la classe peuvent appartenir au moment de la compilation et que le programme s'appuie uniquement sur les informations d'exécution pour découvrir les informations réelles de l'objet et de la classe, la réflexion doit être utilisée à ce momentPerson p =new Student();
3. API de réflexion Java
L'API de réflexion est utilisée pour générer des informations sur les classes, les interfaces ou les objets dans la machine virtuelle JAVA actuelle.
● Classe Class : la classe principale de réflexion, qui peut obtenir les attributs, méthodes et autres informations de contenu de la classe
● Classe Field : Java.lang.reflect. la classe, qui peut être obtenue et définie La valeur d'attribut de la classe.
●Classe de méthode : Java.lang.reflect. Représente une méthode de classe, qui peut être utilisée pour obtenir des informations sur les méthodes de la classe ou exécuter des méthodes
Classe Constructor : Java.lang.reflect. Représente la méthode constructeur de la classe.
4. Obtenez toutes les méthodes et attributs
Classe de personnepackage 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; } }
Entrée com.pb.Reflect.classinfo.Person
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("路径输入错误!"); } } }Résultat :
package com.pb.Reflect.classinfo; public class TestReflection { public static void main(String[] args) { ReflectDemo rd=new ReflectDemo(); } }Ce qui précède est le contenu du guide d'analyse du mécanisme de réflexion Java. Pour plus de contenu connexe, veuillez. faites attention au site Web PHP chinois (www.php.cn) !
========获取方法信息============ 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) ========获取构造方法信息结束============