Cet article présente principalement des informations pertinentes sur l'explication détaillée des exemples de mécanisme de réflexion Java. Voici une analyse détaillée du mécanisme de réflexion en Java. Les amis dans le besoin peuvent se référer à
Explication détaillée de Java. Exemples de mécanismes de réflexion.
1. JAVA est-il un langage dynamique ?
De manière générale, lorsqu'il s'agit de langages dynamiques, cela signifie que la structure du programme ou le type de variable peut changer pendant l'exécution du programme. De ce point de vue, Java, comme C++, l'est. pas un langage dynamique.
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 n'importe quelle classe, toutes les propriétés et méthodes de cette classe peuvent être connues ;
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 le mécanisme de réflexion du langage Java
II , Dynamique propriétés
2.1, Propriétés dynamiques
Générer des instances d'objet au moment de l'exécution ;
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
Déterminer la classe à laquelle appartient tout objet au moment de l'exécution
Construire n'importe quelle classe au moment de l'exécution Objet
détermine les méthodes et les attributs de n'importe quelle classe au moment de l'exécution
appelle la méthode de n'importe quel objet au moment de l'exécution
génère un proxy dynamique
Scénarios d'application de réflexion Java<.>
De nombreux objets dans les programmes Java auront deux types au moment de l'exécution : le type au moment de la compilation et le type au moment de l'exécutionLe type au moment de la compilation est déterminé par le moment où l'objet est déclaré. utilisé est déterminé par le type utilisé. Le type au moment de l'exécution est déterminé par le type réellement attribué à l'objet Par exemple :Person p =new Student();
3. API Java Reflection
L'API Reflection est utilisée pour générer des informations sur les classes, les interfaces ou les objets dans la machine virtuelle JAVA actuelle. Classe de classe : la classe principale de réflexion, qui peut obtenir les attributs, méthodes et autres informations de contenu de la classe.Classe de champ : Java.lang.reflect. Représente les attributs de la classe et peut obtenir et définir les valeurs d'attribut de la classe.
Classe de méthode : Java.lang.reflect. Représente une méthode d'une classe, qui peut être utilisée pour obtenir des informations sur les méthodes d'une 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; } }
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(); } }
========获取方法信息============ 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) ========获取构造方法信息结束============
5. Étapes pour utiliser la réflexion
Étapes
Java.lang.reflectRécupérez l'objet Java.lang.Class de la classe que vous souhaitez exploiterAppelez la méthode de Class
Utilisez l'API de réflexion pour exploiter ces informations
5.2. Comment obtenir l'objet Class
Appeler la méthode getClass() d'un objetPerson p = new Person(); Class cla=p.getClass();
Class cls=Person.class;
Class cla=Class.forName(“类的全路径”);
6. La méthode getClass() du deuxième objet méthode
Classe Personne, car l'objet est à déclarer, la méthode constructeur est publiquepackage 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; } }
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("========获取成员构造方法信息结束============"); } }
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. L'attribut .class de la troisième classe de méthode <🎜. >La classe de personne est la même que ci-dessus
Classe de test :
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("========获取成员构造方法信息结束============"); } }
Idem que ci-dessus
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!