English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introduction et exemple de l'utilisation du mécanisme de réflexion en Java

本文实例讲述了Java编程反射机制用法。分享给大家供大家参考,具体如下:

前言:反射:动态获取类(字节码文件如本篇中的Person.class),并对其成员进行运行。反射在Android应用层的开发中可能遇到会稍微少一点,但对于想打通底层的小伙伴来说,必须要熟练掌握运用。

实体类

Person.java

package com.sunwenou.reflect;// 包名
public class Person {
  private String name;
  private int age;
  public Person() {// 无参
  }
  public Person(String name, int age) {// Parameterized
    super();
    this.name = name;
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public String toString() {
    return name+","+age;
  }
  public void show() { // Parameterless
    System.out.println("show");
  }
  public void fun(String ss) { // Parameterized
    System.out.println(ss);
  }
  public static void function() { // Static
    System.out.println("static");
  }
}

Dynamic acquisition of bytecode file method

In this article, to make the blog look concise, exceptions are thrown in general, and imports are omitted as before.

package com.sunwenou.reflect;
public class Demo1 {
  /**
   * Dynamic acquisition of bytecode file method
   * 1:Use the Class getClass() method provided by Object class
   *  This method requires an object
   * 2:Each data type has a static class attribute, this attribute returns the bytecode file object of this data type
   *  int.class  Person.class
   * 3:Use the forName() method provided by Class
   *  Only a string needs to be provided, this string is composed of the package name+Class name composition
   */
  public static void main(String[] args) throws Exception {
    //getClaz();
    //getCalz2()
    getClaz3()
  }
  //Use the forName() method provided by Class
  public static void getClaz3() throws Exception {
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person");
    System.out.println(claz==claz2);
  }
  //Each data type has a static class attribute
  public static void getCalz2() {
    Class<Person> p1 = Person.class;
    Class<Person> p2 = Person.class;
    System.out.println(p1==p2);
  }
  //Use the Class getClass() method provided by the Object class
  public static void getClaz() {
    Person person1 = new Person();
    Class<? extends Person> claz = person1.getClass();//Person.class
    Person person2 = new Person();
    Class<? extends Person> claz2 = person2.getClass();//Person.class
    System.out.println(claz==claz2);
  }
}

Dynamic acquisition of class and object creation

package com.sunwenou.reflect;
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //createObj();
    createObj2()
  }
  public static void createObj2() throws Exception {
    //Person person = new Person("lisi",23);
    //Obtenir l'objet bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class
    //Obtenir l'objet de type Constructor appartenant à la méthode de construction avec des paramètres
    Constructor constructor = claz.getConstructor(String.class,int.class);
    //Créer un objet en utilisant la méthode de création d'objet fournie par la classe Constructor
    Person person = (Person)constructor.newInstance("lisi",23);
    System.out.println(person);
  }
  public static void createObj() throws Exception {
    //Person person = new Person();
    //Obtenir l'objet bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Object obj = claz.newInstance();//Créer l'objet par défaut en utilisant le constructeur sans paramètres
    System.out.println(obj);
  }
}

Obtenir dynamiquement la classe et affecter une valeur au membre variable

package com.sunwenou.reflect;
public class Demo3 {
  public static void main(String[] args) throws Exception {
    //Person p = new Person();
    //p.name = "lisi";
    //Obtenir l'objet bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //Obtenir l'objet de type Field appartenant au membre variable
    //Field field = claz.getField("name");//C'est un membre de permission public
    Field field = claz.getDeclaredField("name");//Obtenir tous les champs déclarés
    System.out.println(field);
    //Les variables membres non statiques dépendent de l'objet
    Object obj = claz.newInstance();
    field.setAccessible(true);//Forcer l'accès, le rendre accessible
    field.set(obj, "张三");
    System.out.println(obj);
  }
}

Obtenir dynamiquement la classe et exécuter la méthode

package com.sunwenou.reflect;
public class Demo4 {
  public static void main(String[] args) throws Exception {
    //method1()
    method2()
    method3()
  }
  public static void method3() throws Exception {
    //Obtenir l'objet bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("function", null);
    m.invoke(null, null);
  }
  ////Exécuter une méthode avec des paramètres
  public static void method2() throws Exception {
    //Obtenir l'objet bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("fun", String.class);
    Object obj = claz.newInstance();
    m.invoke(obj, "hello");
  }
  //Exécuter une méthode sans paramètres
  public static void method1() throws Exception {
    //Person person = new Person(); person.show();
    //Obtenir l'objet bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //Obtenir l'objet bytecode de la méthode à exécuter
    Method m = claz.getMethod("show", null);
    //Les méthodes non statiques dépendent de l'objet
    Object obj = claz.newInstance();
    //Exécuter la méthode
    m.invoke(obj, null);
  }
}

Voici l'utilisation de base de la réflexion, nous pouvons créer des objets via les fichiers bytecode des objets lorsque nous ne pouvons pas créer des objets de manière normale, et exécuter les méthodes qu'ils contiennent, avez-vous appris cela ??

Les lecteurs intéressés par plus de contenu sur Java peuvent consulter les sujets spéciaux de ce site : "Entrée en matière et avancement dans la conception de programmes orientés objets Java", "Tutoriel sur les structures de données et algorithmes Java", "Résumé des techniques pour manipuler les nœuds DOM en Java", "Résumé des techniques pour manipuler les fichiers et dossiers en Java" et "Résumé des techniques pour manipuler les caches en Java"

J'espère que ce tutoriel pourra aider les développeurs Java dans leur conception de programmes.

Déclaration : le contenu de cet article est issu du réseau, propriété des auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet de manière volontaire. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique pertinente. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois confirmée, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.

Vous pourriez aussi aimer