Java-refleksjon (med eksempler)

I denne opplæringen lærer vi refleksjon, en funksjon i Java-programmering som lar oss inspisere og endre klasser, metoder osv.

I Java lar refleksjon oss inspisere og manipulere klasser, grensesnitt, konstruktører, metoder og felt i løpetid.

Det er en klasse i Java som heter Classall informasjon om objekter og klasser i løpetid. Objektet til klasse kan brukes til å utføre refleksjon.

Refleksjon av Java-klasser

For å gjenspeile en Java-klasse, må vi først lage et objekt av Class.

Ved å bruke objektet kan vi kalle forskjellige metoder for å få informasjon om metoder, felt og konstruktører som er tilstede i en klasse.

Det finnes tre måter å lage objekter av klasse på:

1. Bruke metoden forName ()

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

Her forName()tar metoden navnet på klassen til å reflekteres som argumentet.

2. Bruke 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 bruker vi objektet til hundeklassen for å lage et objekt av klasse.

3. Bruke .class-utvidelse

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

Nå som vi vet hvordan vi kan lage objekter av Class. Vi kan bruke dette objektet for å få informasjon om tilsvarende klasse ved kjøretid.

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

Produksjon

 Navn: Hundemodifikator: offentlig Superklasse: Dyr

I eksemplet ovenfor har vi laget en superklasse: Dyr og en underklasse: Hund. Her prøver vi å inspisere klassen Hund.

Legg merke til uttalelsen,

 Class obj = d1.getClass();

Her lager vi et objekt obj av klasse ved hjelp av getClass()metoden. Ved å bruke objektet kaller vi forskjellige metoder for klasse.

  • obj.getName () - returnerer navnet på klassen
  • obj.getModifiers () - returnerer tilgangsmodifikatoren til klassen
  • obj.getSuperclass () - returnerer superklassen til klassen

For å lære mer om det Class, besøk Java Class (offisiell Java-dokumentasjon).

Merk : Vi bruker Modifierklassen til å konvertere modifikatoren for heltallstilgang til en streng.

Reflekterende felt, metoder og konstruktører

Pakken java.lang.reflectinneholder klasser som kan brukes til å manipulere klassemedlemmer. For eksempel,

  • Metodeklasse - gir informasjon om metoder i en klasse
  • Feltklasse - gir informasjon om felt i en klasse
  • Konstruktorklasse - gir informasjon om konstruktører i en klasse

1. Refleksjon av Java-metoder

Den Methodklasse gir forskjellige metoder som kan brukes for å få informasjon om de fremgangsmåter som er tilstede 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(); ) ) )

Produksjon

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

I eksemplet ovenfor prøver vi å få informasjon om metodene som er tilstede i hundeklassen. Som nevnt tidligere, har vi først opprettet et objekt med formål å Classbruke getClass()metoden.

Legg merke til uttrykket,

 Method() methods = obj.getDeclaredMethod();

Her getDeclaredMethod()returnerer alle metodene som er tilstede i klassen.

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

  • m.getName () - returnerer navnet på en metode
  • m.getModifiers () - returnerer tilgangsmodifikatoren for metoder i heltallform
  • m.getReturnType () - returnerer returtypen av metoder

Den Methodklasse gir også forskjellige andre fremgangsmåter som kan brukes til å inspisere metoder under kjøring. For å lære mer, besøk Java Method-klassen (offisiell Java-dokumentasjon).

2. Refleksjon av Java-felt

Som metoder kan vi også inspisere og modifisere forskjellige felt i en klasse ved hjelp av metodene i Fieldklassen. 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(); ) ) )

Produksjon

 Verdi: labrador Modifikator: offentlig

I eksemplet ovenfor har vi opprettet en klasse som heter Dog. Det inkluderer et offentlig felt med navnet type. Legg merke til uttalelsen,

 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 tilgang til alle konstruktørene som er til stede i Dog og tilordner dem til en rekke konstruktører av Constructortypen.

Vi brukte deretter objekt c for å få forskjellig informasjon om konstruktøren.

  • c.getName () - returnerer navnet på konstruktøren
  • c.getModifiers () - returnerer tilgangsmodifikatorene til konstruktøren i heltallform
  • c.getParameterCount () - returnerer antall parametere som er tilstede i hver konstruktør

For å lære om flere metoder i Constructorklassen, besøk Constructor-klassen

Interessante artikler...