English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье рассматривается использование механизма反射 в программировании 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 (во время отправки письма замените # на @) для сообщения о нарушении,并提供相关证据. В случае подтверждения факта нарушения, сайт незамедлительно удаляет涉嫌侵权的内容.