In deze tutorial zullen we reflectie leren, een functie in Java-programmering waarmee we klassen, methoden, enz. Kunnen inspecteren en wijzigen.
In Java stelt reflectie ons in staat om klassen, interfaces, constructors, methoden en velden tijdens runtime te inspecteren en te manipuleren.
Er is een klasse in Java met de naam Class
die alle informatie over objecten en klassen tijdens runtime bewaart. Het object van Class kan worden gebruikt om reflectie uit te voeren.
Reflectie van Java-klassen
Om een Java-klasse weer te geven, moeten we eerst een object Class maken.
En door het object te gebruiken, kunnen we verschillende methoden aanroepen om informatie te krijgen over methoden, velden en constructors die in een klasse aanwezig zijn.
Er zijn drie manieren om objecten van Class te maken:
1. Gebruik de methode forName ()
class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");
Hier neemt de forName()
methode de naam van de klasse die moet worden weergegeven als argument.
2. Met de methode getClass ()
// create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();
Hier gebruiken we het object van de klasse Dog om een object van Class te maken.
3. Gebruik de .class-extensie
// create an object of Class // to reflect the Dog class Class c = Dog.class;
Nu we weten hoe we objecten van de Class
. We kunnen dit object gebruiken om tijdens runtime informatie over de corresponderende klasse te krijgen.
Voorbeeld: 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(); ) ) )
Uitvoer
Naam: Dog Modifier: public Superklasse: Dier
In het bovenstaande voorbeeld hebben we een superklasse gemaakt: dier en een subklasse: hond. Hier proberen we de klasse Hond te inspecteren.
Let op de verklaring,
Class obj = d1.getClass();
Hier maken we een objectobj van Class met behulp van de getClass()
methode. Met behulp van het object roepen we verschillende methoden van Class aan.
- obj.getName () - geeft de naam van de klasse terug
- obj.getModifiers () - geeft de toegangsmodificator van de klasse terug
- obj.getSuperclass () - geeft de superklasse van de klasse terug
Voor meer informatie over Class
, bezoek Java Class (officiële Java documentatie).
Opmerking : we gebruiken de Modifier
klasse om de toegangsmodificator voor gehele getallen om te zetten in een tekenreeks.
Reflecterende velden, methoden en constructeurs
Het pakket java.lang.reflect
biedt klassen die kunnen worden gebruikt voor het manipuleren van klasleden. Bijvoorbeeld,
- Methodeklasse - geeft informatie over methoden in een klasse
- Veldklasse - geeft informatie over velden in een klas
- Constructorklasse - geeft informatie over constructeurs in een klasse
1. Reflectie van Java-methoden
De Method
klasse biedt verschillende methoden die kunnen worden gebruikt om informatie te krijgen over de methoden die in een klasse aanwezig zijn. Bijvoorbeeld,
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(); ) ) )
Uitvoer
Methodenaam: weergave Modificator: openbaar Retourtypen: void Naam methode: makeSound Modificator: privé Retourtypen: ongeldig
In het bovenstaande voorbeeld proberen we informatie te krijgen over de methoden die aanwezig zijn in de klasse Dog. Zoals eerder vermeld, hebben we eerst een objectobject gemaakt van het Class
gebruik van de getClass()
methode.
Let op de uitdrukking,
Method() methods = obj.getDeclaredMethod();
Hier getDeclaredMethod()
retourneert het alle methoden die aanwezig zijn in de klasse.
We hebben ook een object m van de Method
klasse gemaakt. Hier,
- m.getName () - geeft de naam van een methode terug
- m.getModifiers () - retourneert de toegangsmodificator van methoden in integer-vorm
- m.getReturnType () - retourneert het retourtype van methoden
De Method
klasse biedt ook verschillende andere methoden die kunnen worden gebruikt om methoden tijdens runtime te inspecteren. Bezoek voor meer informatie de klasse Java Method (officiële Java-documentatie).
2. Weerspiegeling van Java-velden
Net als methoden kunnen we ook verschillende velden van een klasse inspecteren en wijzigen met behulp van de methoden van de Field
klasse. Bijvoorbeeld,
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(); ) ) )
Uitvoer
Waarde: labrador Modifier: openbaar
In het bovenstaande voorbeeld hebben we een klasse gemaakt met de naam Dog. Het bevat een openbaar veld met de naam type. Let op de verklaring,
Field field1 = obj.getField("type");
Here, we are accessing the public field of the Dog class and assigning it to the object field1 of the Field class.
We then used various methods of the Field
class:
- field1.set() - sets the value of the field
- field1.get() - returns the value of field
- field1.getModifiers() - returns the value of the field in integer form
Similarly, we can also access and modify private fields as well. However, the reflection of private field is little bit different than the public field. For example,
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(); ) ) )
Output
Value: brown Modifier: private
In the above example, we have created a class named Dog. The class contains a private field named color. Notice the statement.
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();
Hier hebben we toegang tot alle constructors die aanwezig zijn in Dog en wijzen deze toe aan arrayconstructors van het Constructor
type.
Vervolgens hebben we object c gebruikt om verschillende informatie over de constructor te krijgen.
- c.getName () - geeft de naam van de constructor terug
- c.getModifiers () - retourneert de toegangsmodificatoren van de constructor in integer-vorm
- c.getParameterCount () - geeft het aantal parameters terug dat aanwezig is in elke constructor
Constructor
Bezoek Constructor class om meer te weten te komen over meer methodes van de klasse