У цьому підручнику ми вивчимо рефлексію, функцію програмування на Java, яка дозволяє перевіряти та змінювати класи, методи тощо.
У Java відображення дозволяє нам перевіряти та обробляти класи, інтерфейси, конструктори, методи та поля під час виконання.
На Java існує клас, Class
який зберігає всю інформацію про об’єкти та класи під час виконання. Об’єкт Класу можна використовувати для відображення.
Відображення класів Java
Для того, щоб відображати клас Java, нам спочатку потрібно створити об'єкт Class.
І, використовуючи об’єкт, ми можемо викликати різні методи, щоб отримати інформацію про методи, поля та конструктори, присутні в класі.
Існує три способи створення об'єктів класу:
1. Використання методу forName ()
class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");
Тут forName()
метод бере назву класу для відображення як аргумент.
2. Використання методу getClass ()
// create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();
Тут ми використовуємо об’єкт класу Dog, щоб створити об’єкт класу.
3. Використання розширення .class
// create an object of Class // to reflect the Dog class Class c = Dog.class;
Тепер, коли ми знаємо, як ми можемо створювати об'єкти Class
. Ми можемо використовувати цей об’єкт для отримання інформації про відповідний клас під час виконання.
Приклад: відображення класу Java
import java.lang.Class; import java.lang.reflect.*; class Animal ( ) // put this class in different Dog.java file public class Dog extends Animal ( public void display() ( System.out.println("I am a dog."); ) ) // put this in Main.java file class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get name of the class String name = obj.getName(); System.out.println("Name: " + name); // get the access modifier of the class int modifier = obj.getModifiers(); // convert the access modifier to string String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the superclass of Dog Class superClass = obj.getSuperclass(); System.out.println("Superclass: " + superClass.getName()); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Вихідні дані
Назва: Модифікатор собаки: загальнодоступний Суперклас: Тварина
У наведеному вище прикладі ми створили суперклас: Тварина та підклас: Собака. Тут ми намагаємось оглянути клас Собака.
Зверніть увагу на заяву,
Class obj = d1.getClass();
Тут ми створюємо об’єкт obj класу за допомогою getClass()
методу. Використовуючи об’єкт, ми викликаємо різні методи Class.
- obj.getName () - повертає ім'я класу
- obj.getModifiers () - повертає модифікатор доступу класу
- obj.getSuperclass () - повертає супер клас класу
Щоб дізнатись більше про це Class
, відвідайте клас Java (офіційна документація Java).
Примітка : Ми використовуємо Modifier
клас для перетворення цілочисельного модифікатора доступу у рядок.
Відображення полів, методів та конструкторів
Пакет java.lang.reflect
містить класи, які можна використовувати для маніпулювання членами класу. Наприклад,
- Клас методів - надає інформацію про методи в класі
- Польовий клас - надає інформацію про поля в класі
- Клас конструктора - надає інформацію про конструктори в класі
1. Відображення методів Java
Method
Клас надає різні методи , які можуть бути використані для отримання інформації про справжній методів в класі. Наприклад,
import java.lang.Class; import java.lang.reflect.*; class Dog ( // methods of the class public void display() ( System.out.println("I am a dog."); ) private void makeSound() ( System.out.println("Bark Bark"); ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // using object of Class to // get all the declared methods of Dog Method() methods = obj.getDeclaredMethods(); // create an object of the Method class for (Method m : methods) ( // get names of methods System.out.println("Method Name: " + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.println("Modifier: " + Modifier.toString(modifier)); // get the return types of method System.out.println("Return Types: " + m.getReturnType()); System.out.println(" "); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )
Вихідні дані
Назва методу: модифікатор дисплея: відкритий Типи повернення: недійсний Назва методу: makeSound Модифікатор: приватний Типи повернення: недійсний
У наведеному вище прикладі ми намагаємося отримати інформацію про методи, присутні в класі Dog. Як вже згадувалося раніше, ми спочатку створили об'єкт obj з Class
використанням getClass()
методу.
Зверніть увагу на вираз,
Method() methods = obj.getDeclaredMethod();
Тут getDeclaredMethod()
повертає всі методи, присутні всередині класу.
Крім того, ми створили об'єкт m Method
класу. Ось,
- m.getName () - повертає ім'я методу
- m.getModifiers () - повертає модифікатор доступу методів у цілочисельній формі
- m.getReturnType () - повертає тип методів повернення
Method
Клас також надає різні інші методи , які можуть бути використані для перевірки методів під час виконання. Щоб дізнатись більше, відвідайте клас Java Method (офіційна документація Java).
2. Відображення полів Java
Як і методи, ми також можемо перевіряти та модифікувати різні поля класу, використовуючи методи Field
класу. Наприклад,
import java.lang.Class; import java.lang.reflect.*; class Dog ( public String type; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access and set the type field Field field1 = obj.getField("type"); field1.set(d1, "labrador"); // get the value of the field type String typeValue = (String) field1.get(d1); System.out.println("Value: " + typeValue); // get the access modifier of the field type int mod = field1.getModifiers(); // convert the modifier to String form String modifier1 = Modifier.toString(mod); System.out.println("Modifier: " + modifier1); System.out.println(" "); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Вихідні дані
Значення: лабрадор Модифікатор: публічний
У наведеному вище прикладі ми створили клас «Dog». Він включає загальнодоступне поле з іменем типу. Зверніть увагу на заяву,
Field field1 = obj.getField("type");
Тут ми отримуємо доступ до відкритого поля класу Dog і присвоюємо його об’єкту field1 класу Field.
Потім ми використовували різні методи Field
заняття:
- field1.set () - встановлює значення поля
- field1.get () - повертає значення поля
- field1.getModifiers () - повертає значення поля у цілочисельній формі
Подібним чином ми також можемо отримувати доступ та змінювати приватні поля. Однак відображення приватного поля трохи відрізняється від публічного. Наприклад,
import java.lang.Class; import java.lang.reflect.*; class Dog ( private String color; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access the private field color Field field1 = obj.getDeclaredField("color"); // allow modification of the private field field1.setAccessible(true); // set the value of color field1.set(d1, "brown"); // get the value of field color String colorValue = (String) field1.get(d1); System.out.println("Value: " + colorValue); // get the access modifier of color int mod2 = field1.getModifiers(); // convert the access modifier to string String modifier2 = Modifier.toString(mod2); System.out.println("Modifier: " + modifier2); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Вихідні дані
Значення: коричневий Модифікатор: приватний
У наведеному вище прикладі ми створили клас «Dog». Клас містить приватне поле з ім'ям color. Зверніть увагу на твердження.
Field field1 = obj.getDeclaredField("color"); field1.setAccessible(true);
Here, we are accessing color and assigning it to the object field1 of the Field
class. We then used field1 to modify the accessibility of color and allows us to make changes to it.
We then used field1 to perform various operations on the private field color.
To learn more about the different methods of Field, visit Java Field Class (official Java documentation).
3. Reflection of Java Constructor
We can also inspect different constructors of a class using various methods provided by the Constructor
class. For example,
import java.lang.Class; import java.lang.reflect.*; class Dog ( // public constructor without parameter public Dog() ( ) // private constructor with a single parameter private Dog(int age) ( ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get all constructors of Dog Constructor() constructors = obj.getDeclaredConstructors(); for (Constructor c : constructors) ( // get the name of constructors System.out.println("Constructor Name: " + c.getName()); // get the access modifier of constructors // convert it into string form int modifier = c.getModifiers(); String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the number of parameters in constructors System.out.println("Parameters: " + c.getParameterCount()); System.out.println(""); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )
Output
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
In the above example, we have created a class named Dog. The class includes two constructors.
We are using reflection to find the information about the constructors of the class. Notice the statement,
Constructor() constructors = obj.getDeclaredConstructor();
Тут ми отримуємо доступ до всіх конструкторів, присутніх у Dog, і призначаємо їх конструкторам масиву Constructor
типу.
Потім ми використовували об’єкт c, щоб отримати різну інформацію про конструктор.
- c.getName () - повертає ім'я конструктора
- c.getModifiers () - повертає модифікатори доступу конструктора у цілочисельній формі
- c.getParameterCount () - повертає кількість параметрів, присутніх у кожному конструкторі
Щоб дізнатись про інші методи Constructor
класу, відвідайте клас Constructor