Java-refleksion (med eksempler)

I denne vejledning lærer vi refleksion, en funktion i Java-programmering, der giver os mulighed for at inspicere og ændre klasser, metoder osv.

I Java giver refleksion os mulighed for at inspicere og manipulere klasser, grænseflader, konstruktører, metoder og felter på kørselstid.

Der er en klasse i Java med navnet, Classder holder al information om objekter og klasser ved kørsel. Objektet i klasse kan bruges til at udføre refleksion.

Refleksion af Java-klasser

For at afspejle en Java-klasse skal vi først oprette et objekt af klasse.

Og ved hjælp af objektet kan vi kalde forskellige metoder for at få information om metoder, felter og konstruktører til stede i en klasse.

Der findes tre måder at oprette objekter i klasse på:

1. Brug af metoden forName ()

 class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");

Her forName()tager metoden navnet på klassen, der skal afspejles som dens argument.

2. Brug af getClass () -metoden

 // create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();

Her bruger vi objektet fra hundeklassen til at skabe et objekt af klasse.

3. Brug af .class-udvidelse

 // create an object of Class // to reflect the Dog class Class c = Dog.class;

Nu hvor vi ved, hvordan vi kan skabe objekter af Class. Vi kan bruge dette objekt til at få information om den tilsvarende klasse ved kørsel.

Eksempel: Java-klassereflektion

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

Produktion

 Navn: Hundemodifikator: offentlig Superklasse: Dyr

I ovenstående eksempel har vi oprettet en superklasse: Animal og en underklasse: Dog. Her prøver vi at inspicere klassen Hund.

Bemærk erklæringen,

 Class obj = d1.getClass();

Her opretter vi et objekt obj fra klasse ved hjælp af getClass()metoden. Ved hjælp af objektet kalder vi forskellige metoder til klasse.

  • obj.getName () - returnerer klassens navn
  • obj.getModifiers () - returnerer adgangsmodifikatoren for klassen
  • obj.getSuperclass () - returnerer superklassen i klassen

For at lære mere om det Class, besøg Java Class (officiel Java-dokumentation).

Bemærk : Vi bruger Modifierklassen til at konvertere adgangsmodifikatoren til heltal til en streng.

Reflekterende felter, metoder og konstruktører

Pakken java.lang.reflectindeholder klasser, der kan bruges til at manipulere klassemedlemmer. For eksempel,

  • Metodeklasse - giver information om metoder i en klasse
  • Feltklasse - giver information om felter i en klasse
  • Konstruktorklasse - giver information om konstruktører i en klasse

1. Refleksion af Java-metoder

Den Methodklasse giver forskellige metoder, der kan bruges til at få information om fremgangsmåderne til stede i en klasse. For eksempel,

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

Produktion

 Metodenavn: display Modifikator: offentlig Returtype: ugyldig Metodenavn: makeSound Modifier: privat Returtyper: ugyldig

I ovenstående eksempel forsøger vi at få information om de metoder, der findes i hundeklassen. Som tidligere nævnt har vi først oprettet et objekt, der har til formål at Classbruge getClass()metoden.

Bemærk udtrykket,

 Method() methods = obj.getDeclaredMethod();

Her getDeclaredMethod()returnerer alle de metoder, der findes i klassen.

Vi har også oprettet et objekt m fra Methodklassen. Her,

  • m.getName () - returnerer navnet på en metode
  • m.getModifiers () - returnerer adgangsmodifikatoren for metoder i heltalform
  • m.getReturnType () - returnerer returneringstypen af ​​metoder

Den Methodklasse tilvejebringer også forskellige andre fremgangsmåder, som kan anvendes til at inspicere metoder på kørselstidspunktet. For at lære mere, besøg klassen Java Method (officiel Java-dokumentation).

2. Refleksion af Java-felter

Ligesom metoder kan vi også inspicere og ændre forskellige felter i en klasse ved hjælp af Fieldklassens metoder . For eksempel,

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

Produktion

 Værdi: labrador Modifikator: offentlig

I ovenstående eksempel har vi oprettet en klasse med navnet Dog. Det inkluderer et offentligt felt med navnet type. Bemærk erklæringen,

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

Her får vi adgang til alle konstruktørerne, der er til stede i Dog, og tildeler dem til en række konstruktører af Constructortypen.

Vi brugte derefter objekt c til at få forskellige oplysninger om konstruktøren.

  • c.getName () - returnerer konstruktørens navn
  • c.getModifiers () - returnerer konstruktørens adgangsmodifikatorer i heltalform
  • c.getParameterCount () - returnerer antallet af parametre, der er til stede i hver konstruktør

For at lære om flere metoder i Constructorklassen, besøg Constructor-klassen

Interessante artikler...