Отражение Java (с примерами)

В этом руководстве мы изучим отражение, функцию программирования на Java, которая позволяет нам проверять и изменять классы, методы и т. Д.

В Java отражение позволяет нам проверять классы, интерфейсы, конструкторы, методы и поля и управлять ими во время выполнения.

В Java есть класс с именем, Classкоторый хранит всю информацию об объектах и ​​классах во время выполнения. Объект Class может использоваться для отражения.

Отражение классов Java

Чтобы отразить класс Java, нам сначала нужно создать объект класса.

И, используя объект, мы можем вызывать различные методы для получения информации о методах, полях и конструкторах, присутствующих в классе.

Существует три способа создания объектов класса:

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(); ) ) )

Вывод

 Имя: Собака Модификатор: общедоступный Суперкласс: Животное

В приведенном выше примере мы создали суперкласс: Animal и подкласс: Dog. Здесь мы пытаемся осмотреть класс Dog.

Обратите внимание на заявление,

 Class obj = d1.getClass();

Здесь мы создаем объект obj класса Class с помощью getClass()метода. Используя объект, мы вызываем разные методы класса.

  • obj.getName () - возвращает имя класса
  • obj.getModifiers () - возвращает модификатор доступа класса
  • obj.getSuperclass () - возвращает суперкласс класса

Чтобы узнать больше Class, посетите Java Class (официальная документация по 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(); ) ) )

Вывод

 Имя метода: display Модификатор: public Типы возврата: void Имя метода: makeSound Модификатор: private Типы возврата: void

В приведенном выше примере мы пытаемся получить информацию о методах, представленных в классе Dog. Как упоминалось ранее, мы сначала создали объект obj Classиспользования getClass()метода.

Обратите внимание на выражение,

 Method() methods = obj.getDeclaredMethod();

Здесь getDeclaredMethod()возвращаются все методы, присутствующие внутри класса.

Также мы создали объект Methodкласса m . Вот,

  • 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. Он включает общедоступное поле с именем type. Обратите внимание на заявление,

 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

Интересные статьи...