Maison  >  Article  >  Java  >  Guide d'analyse du mécanisme de réflexion Java

Guide d'analyse du mécanisme de réflexion Java

黄舟
黄舟original
2017-02-06 16:17:421294parcourir

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


Nature dynamique


.

2.1. Nature dynamique


● Générer des instances d'objet pendant 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


●Dans. Déterminer la classe à laquelle appartient un objet au moment de l'exécution


● 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 Étudiant

De 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 moment
Person 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 personne


Utilisez la réflexion :

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;
}

}

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)
========获取构造方法信息结束============

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn