В този урок ще научим размисъл, функция в програмирането на Java, която ни позволява да проверяваме и модифицираме класове, методи и т.н.
В Java отражението ни позволява да проверяваме и манипулираме класове, интерфейси, конструктори, методи и полета по време на изпълнение.
В Java има клас с име, Class
който съхранява цялата информация за обекти и класове по време на изпълнение. Обектът на 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, за да създадем обект от Class.
3. Използване на .class разширение
// create an object of Class // to reflect the Dog class Class c = Dog.class;
Сега, когато знаем как можем да създаваме обекти на Class
. Можем да използваме този обект, за да получим информация за съответния клас по време на изпълнение.
Пример: Java Class Reflection
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 от Class, използвайки getClass()
метода. Използвайки обекта, ние извикваме различни методи на Class.
- 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(); ) ) )
Изход
Име на метод: дисплей Модификатор: публични типове на връщане: void Име на метод: makeSound модификатор: частни типове на връщане: void
В горния пример се опитваме да получим информация за методите, присъстващи в класа 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 и го присвояваме на обектното поле1 от класа 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 class