Java refleksija (ar piemēriem)

Šajā apmācībā mēs iemācīsimies refleksiju, Java programmēšanas funkciju, kas ļauj mums pārbaudīt un modificēt klases, metodes utt.

Java valodā refleksija ļauj mums pārbaudīt un manipulēt klases, saskarnes, konstruktorus, metodes un laukus izpildes laikā.

Java valodā ir klase ar nosaukumu, Classkas izpildlaikā saglabā visu informāciju par objektiem un klasēm. Klases objektu var izmantot refleksijas veikšanai.

Java klašu atspoguļojums

Lai atspoguļotu Java klasi, mums vispirms jāizveido klases objekts.

Izmantojot objektu, mēs varam izsaukt dažādas metodes, lai iegūtu informāciju par klasē esošajām metodēm, laukiem un konstruktoriem.

Klases objektu izveidošanai ir trīs veidi:

1. Izmantojot forName () metodi

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

Šeit forName()metode uzskata, ka klases nosaukums jāatspoguļo kā arguments.

2. Izmantojot metodi getClass ()

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

Šeit mēs izmantojam suņu klases objektu, lai izveidotu klases objektu.

3. Izmantojot paplašinājumu .class

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

Tagad, kad mēs zinām, kā mēs varam izveidot Class. Mēs varam izmantot šo objektu, lai izpildes laikā iegūtu informāciju par atbilstošo klasi.

Piemērs: Java klases refleksija

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

Rezultāts

 Nosaukums: Suņa modifikators: publiskā superklase: Dzīvnieks

Iepriekš minētajā piemērā mēs esam izveidojuši superklasi: Dzīvnieks un apakšklasi: Suns. Šeit mēs cenšamies pārbaudīt klases suni.

Ievērojiet paziņojumu,

 Class obj = d1.getClass();

Šeit mēs izveidojam objekta obj of Class, izmantojot getClass()metodi. Izmantojot objektu, mēs saucam dažādas klases klases.

  • obj.getName () - atgriež klases nosaukumu
  • obj.getModifiers () - atgriež klases piekļuves modifikatoru
  • obj.getSuperclass () - atgriež klases superklasi

Lai uzzinātu vairāk par to Class, apmeklējiet Java klasi (oficiālā Java dokumentācija).

Piezīme . Mēs izmantojam Modifierklasi, lai veselā skaitļa piekļuves modifikatoru pārveidotu par virkni.

Atspoguļojošie lauki, metodes un konstruktori

Pakete java.lang.reflectnodrošina klases, kuras var izmantot, lai manipulētu ar klases biedriem. Piemēram,

  • Metode klase - sniedz informāciju par metodēm klasē
  • Lauku klase - sniedz informāciju par laukiem klasē
  • Konstruktora klase - sniedz informāciju par konstruktoriem klasē

1. Java metožu atspoguļojums

MethodKlase nodrošina dažādas metodes, ko var izmantot, lai iegūtu informāciju par metodēm, kas atrodas klasē. Piemēram,

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

Rezultāts

 Metodes nosaukums: display Modifier: public Return Types: void Metodes nosaukums: makeSound Modifier: private Return Types: void

Iepriekš minētajā piemērā mēs cenšamies iegūt informāciju par metodēm, kas ir sastopamas Suņu klasē. Kā minēts iepriekš, mēs vispirms esam izveidojuši objekta obj Classizmantošanas getClass()metodi.

Ievērojiet izteicienu,

 Method() methods = obj.getDeclaredMethod();

Šeit tiek getDeclaredMethod()atgrieztas visas klases iekšienē esošās metodes.

Arī mēs esam izveidojuši objektu m no Methodklases. Šeit,

  • m.getName () - atgriež metodes nosaukumu
  • m.getModifiers () - atgriež metožu piekļuves modifikatoru vesela skaitļa formā
  • m.getReturnType () - atgriež metožu atgriešanas veidu

MethodKlase piedāvā arī dažādas citas metodes, kuras var izmantot, lai pārbaudītu metodes pie palaist laikā. Lai uzzinātu vairāk, apmeklējiet Java Method klasi (oficiālā Java dokumentācija).

2. Java lauku atspoguļošana

Tāpat kā metodes, mēs varam arī pārbaudīt un modificēt dažādus klases laukus, izmantojot klases metodes Field. Piemēram,

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

Rezultāts

 Vērtība: labradors Modificētājs: publisks

Iepriekš minētajā piemērā mēs esam izveidojuši klasi ar nosaukumu Suns. Tas ietver publisku lauku, kura nosaukums ir tips. Ievērojiet paziņojumu,

 Field field1 = obj.getField("type");

Šeit mēs piekļūstam suņu klases publiskajam laukam un piešķiram to lauka klases objekta laukam1.

Pēc tam mēs izmantojām dažādas Fieldklases metodes :

  • field1.set () - iestata lauka vērtību
  • field1.get () - atgriež lauka vērtību
  • field1.getModifiers () - atgriež lauka vērtību vesela skaitļa formā

Līdzīgi mēs varam arī piekļūt privātiem laukiem un tos modificēt. Tomēr privātā lauka atspoguļojums nedaudz atšķiras no publiskā lauka. Piemēram,

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

Rezultāts

 Vērtība: brūna Modificētājs: privāts

Iepriekš minētajā piemērā mēs esam izveidojuši klasi ar nosaukumu Suns. Klase satur privātu lauku ar nosaukumu krāsa. Ievērojiet paziņojumu.

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

Šeit mēs piekļūstam visiem konstruktoriem, kas atrodas Dog, un tos piešķiram šāda Constructorveida masīvu konstruktoriem .

Pēc tam mēs izmantojām objektu c, lai iegūtu dažādu informāciju par konstruktoru.

  • c.getName () - atgriež konstruktora vārdu
  • c.getModifiers () - atgriež konstruktora piekļuves modifikatorus vesela skaitļa formā
  • c.getParameterCount () - atgriež katrā konstruktorā esošo parametru skaitu

Lai uzzinātu vairāk par Constructorklases metodēm , apmeklējiet konstruktoru klasi

Interesanti raksti...