1. Введение
Отражение Java - это механизм, который позволяет нам получать внутреннюю информацию о методах класса, свойствах, родительских классах, интерфейсах и т. Д. Во время выполнения. Другими словами, отражение - это, по сути, «обратный» процесс. Когда мы создаем экземпляр класса через new , он фактически построен виртуальной машиной Java, основанным на объекте Class этого класса во время выполнения, и размышление состоит в том, чтобы получить информацию о его определении через Class объекта класса, чтобы мы могли получить доступ к его свойствам и методам, знать родительский класс этого класса, который реализован интерфейсы, и другую информацию.
2. Класс
Мы знаем, что использование Javac может компилировать. Java -файлы в файлы .class, которые содержат нашу исходную информацию о определении для класса (родительский класс, интерфейс, конструктор, свойства, методы и т. Д.). Файл .class будет загружен в виртуальную машину Java (JVM) ClassLoader во время выполнения. Когда файл .class загружен, JVM будет генерировать объект класса для него. Объекты, которые мы создаем через новые в программе, фактически построены на основе соответствующего объекта класса во время выполнения. Чтобы быть точным, этот объект класса на самом деле является экземпляром java.lang.Class<T> универсального класса. Например, объект Class<MyClass> - это экземпляр Class<T> , который инкапсулирует информацию о определении класса MyClass . Поскольку класс java.lang.Class<T> не имеет общественного конструктора, мы не можем создать экземпляр этого класса напрямую. Мы можем получить объект класса с помощью следующего метода.
В следующем объяснении мы возьмем класс людей и класс учеников в качестве примеров:
Public Class People {Private String Name; частный int возраст; Public People (String name, int age) {this.name = name; this.age = возраст; } public int getage () {return Age; } public String getName () {return name; } public void setage (int age) {this.age = age; } public void setName (string name) {this.name = name; } public void speak () {System.out.println (getName () + "" + getage ()); }} студент открытого класса расширяет People {private int grade; Общественный студент (название строки, int age) {super (имя, возраст); } public Student (название строки, int age, int grade) {super (имя, возраст); this.Grade = Grade; } public int getGrade () {return Grade; } public void setGrade (int grade) {this.grade = grade; } private void Learn (String Course) {System.out.println (name + "Learn" + Course); }} Получить объект класса по имени класс
Если мы знаем название класса в течение периода компиляции, мы сможем получить его объект класса таким образом:
Класс <People> peopleclass = people.class;
Существует также метод получения объектов класса на основе полного имени пути класса следующим образом:
// Предположим, что класс People находится в классе Com.test Package <People> peopleclass = class.forname ("com.test.people"); Обратите внимание, что параметр метода Class.forName() должен быть полным именем пути класса. На самом деле, пока мы «импортируем com.test.people», мы можем напрямую получить его объект класса через « People.class », не выписывая весь путь. (Если соответствующий класс не найден в classpath при вызове метода Class.forName() , ClassNotFoundException будет брошено.)
Получить свой объект класса через сам объект
Люди люди = новые люди («Билл», 18); класс <People> peopleClass = people.getClass ();
Получите конструктор класса по размышлениям
Как только мы получили объект класса People , мы можем получить оригинальную информацию об определении класса People через этот объект класса. Во -первых, давайте получим объект конструктора класса People . С помощью этого объекта конструктора мы можем построить объект People . Например, мы можем добавить следующий код в Student.java:
public static void main (String [] args) {class <People> pclass = people.class; try {constructor <People> constructor = pclass.getConstructor (String.class, int.class); Люди люди = конструктор. Newinstance («Билл», 18); obj.speak (); } catch (Exception e) {}} В вышеперечисленном мы называем метод getConstructor , чтобы получить объект конструктора класса People . Поскольку конструктор, мы хотим получить формальные параметры типа String и int , мы передаем String.class и int.class . С помощью объекта конструктора мы можем вызвать метод newInstance , чтобы создать объект people .
Обратите внимание, что когда Constructor класса, Method и Field объекты получаются посредством отражения, перед вызовом методов этих объектов, accessible флаг этого объекта устанавливается на true , чтобы отменить проверку доступа к языку Java, что может улучшить скорость отражения. Как показано в следующем коде:
Конструктор <People> constructor = peopleclass.getConstructor (String.class, int.class); // Установить доступное свойство конструктора для отмены конструктора проверки доступа Java.setAccessible (true);
Получение методов, объявленных в классе, посредством размышлений
Получить объявленный метод в текущем классе (за исключением унаследованного от родительского класса)
Чтобы получить все методы, объявленные в текущем классе, вы можете использовать функцию getDeclaredMethods в классе. Он получит все методы, объявленные в текущем классе (включая private , public , static и другие методы). Он вернет массив объектов Method , и каждый объект Method представляет метод, объявленный в классе. Чтобы получить указанный метод, вы можете вызвать getDeclaredMethod(String name, Class...<T> parameterTypes) .
Как показано в следующем коде:
Частный статический void showdeclaredmethods () {студент = новый студент («Билл», 18); // Получить все методы, объявленные методом класса учащегося [] methods = study.getClass (). GetDeclaredMethods (); try {// Получить объект LearnMethod (инкапсулированный метод обучения) Method LearnMethod = Student.getClass (). getDeclaredMethod ("Learn", String.class); // Получить список параметров метода обучения и распечатать его класс <?> [] Paramclasses = inemymethod.getParameterTypes (); for (class <?> class: paramclasses) {System.out.println ("Метод обучения Параметры:" + class.getName ()); } // Судить, является ли метод обучения частной системой. // позвонить в метод обучения Learnmethod.invoke (студент, «Java Reflection»); } catch (Exception e) {}} Получить публичные методы, объявленные в текущем классе и родительском классе
Чтобы получить текущий класс и все public методы, объявленные в родительском классе, вы можете вызвать функцию getMethods и получить указанный public метод, вы можете вызвать метод getMethod . Пожалуйста, смотрите следующий код:
Private Static void Showmethods () {Студент = новый студент ("Mr.Simple"); // Получить все общедоступные методы (включая самого студента и унаследовать от метода родительского класса) [] Методы = Student.getClass (). GetMethods (); Попробуйте {// Обратите внимание, что только публичные методы могут быть получены через getMethod. Если вы попытаетесь получить личный метод, будет брошено исключение. Method LearnMethod = Student.getClass (). GetMethod ("Learn", String.class); } catch (Exception e) {}} Получите атрибуты, определенные в классе
Получение атрибутов аналогично получению методов, за исключением того, что призыв к методам getMethods() / getDeclaredMethods() заменяется при вызове методов getFields() / getDeclaredFields() .
Получить атрибуты, определенные в текущем классе (за исключением атрибутов, унаследованных от родительского класса)
Чтобы получить все атрибуты, определенные в текущем классе (включая различные атрибуты, такие как private , public , static и т. Д.), Вы можете вызвать функцию getDeclaredFields объекта класса; Чтобы получить указанные атрибуты, вы можете позвонить getDeclaredField .
Как показано в следующем коде:
Private Static void ShowDeclaredFields () {Студент Студент = новый студент («Билл», 18); // Получить все атрибуты, определенные в текущем поле класса [] fields = study.getClass (). GetDeclaredFields (); try {// Получить указанный атрибут поля Gradefield = study.getClass (). getDeclaredfield ("Grade"); // Получить систему значений атрибутов. // Установить значение атрибута gradefield.set (студент, 10); } catch (Exception e) {}} Получите публичные атрибуты, определенные в текущем классе и родительском классе
Чтобы определить все public свойства в текущем классе и родительском классе, вы можете вызвать функцию getFields объекта Class . Чтобы получить указанную public собственность, вы можете вызвать метод getField , как показано в следующем коде:
private static void showfields () {студент студента = новый студент («Билл», 18); // Получить все общедоступные свойства текущего класса и поля родительского класса [] publicFields = student.getClass (). GetFields (); } Отражение для получения родительского класса класса и интерфейса, реализованного классом
Получить родительский класс
Просто вызовите метод getSuperClass объекта Class , как показано в следующем коде:
Студент студент = новый студент («Билл», 18); класс <?> Superclass = student.getClass (). GetSuperClass ();
Получите реализованный интерфейс
Чтобы узнать, какие интерфейсы внедряют класс, просто вызовите метод getInterfaces объекта Class , как показано в следующем коде:
Private Static void ShowInterfaces () {Студент = новый студент («Билл», 19); Class <?> [] Interfaces = study.getClass (). GetInterfaces ();}Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения и работы.