În acest tutorial, vom învăța reflecția, o caracteristică în programarea Java care ne permite să inspectăm și să modificăm clase, metode etc.
În Java, reflecția ne permite să inspectăm și să manipulăm clase, interfețe, constructori, metode și câmpuri în timpul rulării.
Există o clasă în Java numită Class
care păstrează toate informațiile despre obiecte și clase în timpul rulării. Obiectul clasei poate fi folosit pentru a efectua reflexia.
Reflectarea claselor Java
Pentru a reflecta o clasă Java, trebuie mai întâi să creăm un obiect al clasei.
Și, folosind obiectul, putem apela diverse metode pentru a obține informații despre metode, câmpuri și constructori prezenți într-o clasă.
Există trei moduri de a crea obiecte de clasă:
1. Folosind metoda forName ()
class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");
Aici, forName()
metoda ia numele clasei pentru a fi reflectat ca argument.
2. Folosind metoda getClass ()
// create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();
Aici, folosim obiectul clasei Dog pentru a crea un obiect al clasei.
3. Utilizarea extensiei .class
// create an object of Class // to reflect the Dog class Class c = Dog.class;
Acum, că știm cum putem crea obiecte ale Class
. Putem folosi acest obiect pentru a obține informații despre clasa corespunzătoare în timpul rulării.
Exemplu: Reflecția clasei 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(); ) ) )
Ieșire
Nume: Câine Modificator: public Superclasă: Animal
În exemplul de mai sus, am creat o superclasă: Animal și o subclasă: Dog. Aici încercăm să inspectăm clasa Câine.
Observați declarația,
Class obj = d1.getClass();
Aici, creăm un obiect obiect al clasei folosind getClass()
metoda. Folosind obiectul, numim diferite metode ale clasei.
- obj.getName () - returnează numele clasei
- obj.getModifiers () - returnează modificatorul de acces al clasei
- obj.getSuperclass () - returnează super clasa clasei
Pentru a afla mai multe despre Class
, vizitați Java Class (documentație oficială Java).
Notă : Folosim Modifier
clasa pentru a converti modificatorul de acces întreg într-un șir.
Câmpuri, metode și constructori care reflectă
Pachetul java.lang.reflect
oferă clase care pot fi utilizate pentru manipularea membrilor clasei. De exemplu,
- Clasa de metode - oferă informații despre metodele dintr-o clasă
- Clasa de câmp - oferă informații despre câmpurile dintr-o clasă
- Clasa constructor - oferă informații despre constructorii dintr-o clasă
1. Reflectarea metodelor Java
Method
Clasa oferă diferite metode care pot fi folosite pentru a obține informații despre metodele prezent într - o clasă. De exemplu,
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(); ) ) )
Ieșire
Nume metodă: afișare Modificator: public Tipuri de returnare: void Nume metodă: makeSound Modifier: privat Tipuri de returnare: nul
În exemplul de mai sus, încercăm să obținem informații despre metodele prezente în clasa Dog. Așa cum am menționat anterior, am creat mai întâi un obiect obiect al Class
utilizării getClass()
metodei.
Observați expresia,
Method() methods = obj.getDeclaredMethod();
Aici, getDeclaredMethod()
returnează toate metodele prezente în interiorul clasei.
De asemenea, am creat un obiect m al Method
clasei. Aici,
- m.getName () - returnează numele unei metode
- m.getModifiers () - returnează modificatorul de acces al metodelor în formă întreagă
- m.getReturnType () - returnează tipul returnat de metode
Method
Clasa oferă , de asemenea , diverse alte metode care pot fi folosite pentru a inspecta metode în timpul rulării. Pentru a afla mai multe, vizitați clasa Java Method (documentație oficială Java).
2. Reflectarea câmpurilor Java
La fel ca metodele, putem inspecta și modifica diferite câmpuri ale unei clase folosind metodele Field
clasei. De exemplu,
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(); ) ) )
Ieșire
Valoare: labrador Modificator: public
În exemplul de mai sus, am creat o clasă numită Dog. Include un câmp public numit tip. Observați declarația,
Field field1 = obj.getField("type");
Aici, accesăm câmpul public al clasei Dog și îl atribuim câmpului obiect 1 al clasei Field.
Apoi am folosit diverse metode ale Field
clasei:
- field1.set () - setează valoarea câmpului
- field1.get () - returnează valoarea câmpului
- field1.getModifiers () - returnează valoarea câmpului în formă întreagă
În mod similar, putem accesa și modifica și câmpuri private. Cu toate acestea, reflectarea câmpului privat este puțin diferită de câmpul public. De exemplu,
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(); ) ) )
Ieșire
Valoare: maro Modificator: privat
În exemplul de mai sus, am creat o clasă numită Dog. Clasa conține un câmp privat numit culoare. Observați declarația.
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();
Aici, accesăm toți constructorii prezenți în Dog și îi atribuim unui constructor de Constructor
tip matrice .
Am folosit apoi obiectul c pentru a obține informații diferite despre constructor.
- c.getName () - returnează numele constructorului
- c.getModifiers () - returnează modificatorii de acces ai constructorului în formă întreagă
- c.getParameterCount () - returnează numărul de parametri prezenți în fiecare constructor
Pentru a afla mai multe metode ale Constructor
clasei, vizitați clasa Constructor