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

Введение в использование механизма reflection в 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) { // с параметрами
    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() { // без параметров
    System.out.println("show");
  }
  public void fun(String ss) { // с параметрами
    System.out.println(ss);
  }
  public static void function() { // статический
    System.out.println("static");
  }
}

Методы динамического получения bytecode файла

В этой статье, чтобы сделать статью более краткой, все исключения выбрасываются, и импорт опущен, далее также.

package com.sunwenou.reflect;
public class Demo1 {
  /**
   * Методы динамического получения bytecode файла
   * 1: Использование метода getClass() класса Object
   *  Этот метод требует объекта
   * 2: Каждый тип данных имеет статическую атрибут class, который возвращает объект bytecode файла этого типа данных
   *  int.class  Person.class
   * 3: Использование метода forName() класса Class
   *  Достаточно предоставить одну строку, которая состоит из имени пакета + имени класса
   */
  public static void main(String[] args) throws Exception {
    //getClaz();
    //getCalz2();
    getClaz3();
  }
  //Использование метода forName() класса 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);
  }
  //У каждого типа данных есть статическая атрибут class
  public static void getCalz2() {
    Class<Person> p1 = Person.class;
    Class<Person> p2 = Person.class;
    System.out.println(p1==p2);
  }
  //Использование метода getClass() класса Object
  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);
  }
}

Динамическое получение класса и создание объекта

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);
    //Получение объекта bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class
    //Получение объекта типа Constructor, принадлежащего к методу с параметрами
    Constructor constructor = claz.getConstructor(String.class,int.class);
    //Использование метода создания объектов, предоставляемого классом Constructor
    Person person = (Person)constructor.newInstance("lisi",23);
    System.out.println(person);
  }
  public static void createObj() throws Exception {
    //Person person = new Person();
    //Получение объекта bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Object obj = claz.newInstance(); // по умолчанию используется пустой параметр для создания объекта
    System.out.println(obj);
  }
}

Динамическое получение класса и назначение значений членам

package com.sunwenou.reflect;
public class Demo3 {
  public static void main(String[] args) throws Exception {
    //Person p = new Person();
    //p.name = "lisi";
    //Получение объекта bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    // получить объект типа Field, принадлежащий члену
    //Field field = claz.getField("name"); // получить public权限的成员
    Field field = claz.getDeclaredField("name"); // получить все объявленные поля
    System.out.println(field);
    // нестатические членские переменные зависят от объекта
    Object obj = claz.newInstance();
    field.setAccessible(true); // насильственное破译, установлено в доступное состояние
    field.set(obj, "张三");
    System.out.println(obj);
  }
}

Динамическое получение класса и выполнение методов

package com.sunwenou.reflect;
public class Demo4 {
  public static void main(String[] args) throws Exception {
    //method1();
    method2();
    method3();
  }
  public static void method3() throws Exception {
    //Получение объекта bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("function", null);
    m.invoke(null, null);
  }
  ////执行带参数的方法
  public static void method2() throws Exception {
    //Получение объекта bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("fun", String.class);
    Object obj = claz.newInstance();
    m.invoke(obj, "hello");
  }
  //Выполнение метода без параметров
  public static void method1() throws Exception {
    //Person person = new Person(); person.show();
    //Получение объекта bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //Получение объекта bytecode метода, который будет выполняться
    Method m = claz.getMethod("show", null);
    //Нестатические методы зависят от объекта
    Object obj = claz.newInstance();
    //Выполнение метода
    m.invoke(obj, null);
  }
}

Это базовое использование отражения, и мы можем создавать объекты через файлы bytecode объектов, когда не можем создавать объекты через обычное создание объектов, и выполнять методы в них, вы научились этому??

Читатели, интересующиеся дополнительной информацией о Java, могут ознакомиться с темами этого сайта: «Введение в объектно-ориентированное программирование на Java и продвинутые курсы», «Учебник по структурам данных и алгоритмам Java», «Суммарные навыки работы с DOM в Java», «Суммарные навыки работы с файлами и каталогами в Java» и «Суммарные навыки работы с кэшем в Java»

Надеюсь, что информация, изложенная в этой статье, поможет вам в программировании на Java.

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат их законным владельцам, материалы предоставлены пользователями Интернета, веб-сайт не обладает правами собственности, материалы не редактировались вручную, и не несут ответственности за соответствующие юридические последствия. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении,并提供相关证据. В случае подтверждения факта нарушения, сайт незамедлительно удаляет涉嫌侵权的内容.

Основной учебник
Вам может понравиться