Maison > Java > javaDidacticiel > Explication détaillée d'exemples de mécanismes de réflexion en Java

Explication détaillée d'exemples de mécanismes de réflexion en Java

黄舟
Libérer: 2017-09-08 11:04:22
original
1127 Les gens l'ont consulté

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écution

Le 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();
Copier après la connexion
Le Le type au moment de la compilation est Personne et le moment de l'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 l'objet au moment de la compilation est Objet, mais le programme. doit appeler le type d’exécution de la méthode 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 au moment de la compilation à quelles classes l'objet et la classe peuvent appartenir, 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

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 personne


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

}
Copier après la connexion
Utiliser la réflexion :


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("路径输入错误!");
    }
  }

}
Copier après la connexion


package com.pb.Reflect.classinfo;

public class TestReflection {

  public static void main(String[] args) {
    ReflectDemo rd=new ReflectDemo();

  }

}
Copier après la connexion
Entrez com.pb.Reflect.classinfo.Person

Résultat :


========获取方法信息============
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)
========获取构造方法信息结束============
Copier après la connexion

5. Étapes pour utiliser la réflexion

Étapes

Java.lang.reflect

Récupérez l'objet Java.lang.Class de la classe que vous souhaitez exploiter

Appelez 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 objet



Person p = new Person();
Class cla=p.getClass();
Copier après la connexion
Appeler l'attribut class d'une classe Pour obtenir l'objet Class correspondant à la classe



Class cls=Person.class;
Copier après la connexion
Utiliser la méthode statique forName() de la classe Class



Class cla=Class.forName(“类的全路径”);
Copier après la connexion

6. La méthode getClass() du deuxième objet méthode

Classe Personne, car l'objet est à déclarer, la méthode constructeur est publique


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

}
Copier après la connexion
Utiliser la réflexion :


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("========获取成员构造方法信息结束============");
  }

}
Copier après la connexion
Test class


package com.pb.Reflect.classinfo;

public class TestReflection {

  public static void main(String[] args) {
    Person p=new Person();
    ReflectDemo rd=new ReflectDemo(p);

  }

}
Copier après la connexion


========获取方法信息============
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)
========获取成员构造方法信息结束============
Copier après la connexion

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 :


Résultat :
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("========获取成员构造方法信息结束============");
  }

}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal