„Java Reflection“ (su pavyzdžiais)

Šioje pamokoje sužinosime refleksiją, „Java“ programavimo funkciją, leidžiančią mums apžiūrėti ir modifikuoti klases, metodus ir kt.

„Java“ atspindys leidžia mums tikrinti ir manipuliuoti klasėmis, sąsajomis, konstruktoriais, metodais ir laukais vykdymo metu.

„Java“ yra klasė, pavadinta, Classkuri visą informaciją apie objektus ir klases saugo vykdymo metu. Klasės objektas gali būti naudojamas refleksijai atlikti.

„Java“ klasių atspindys

Norėdami atspindėti „Java“ klasę, pirmiausia turime sukurti „Class“ objektą.

Naudodami objektą galime paskambinti įvairiais metodais, kad gautume informacijos apie klasėje esančius metodus, laukus ir konstruktorius.

Klasės objektams sukurti yra trys būdai:

1. Naudojant forName () metodą

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

Čia forName()metodas nurodo klasės pavadinimą, kuris turi būti atspindėtas kaip argumentas.

2. Naudojant getClass () metodą

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

Čia mes naudojame „Dog“ klasės objektą kurdami „Class“ objektą.

3. Naudojant .class plėtinį

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

Dabar, kai žinome, kaip galime sukurti Class. Šį objektą galime naudoti norėdami gauti informacijos apie atitinkamą klasę vykdymo metu.

Pavyzdys: „Java“ klasės atspindys

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

Rezultatas

 Vardas: Šuns modifikatorius: viešoji superklasė: Gyvūnas

Ankstesniame pavyzdyje mes sukūrėme superklasę: Gyvūnas ir poklasį: Šuo. Čia mes bandome apžiūrėti klasės šunį.

Atkreipkite dėmesį į pareiškimą,

 Class obj = d1.getClass();

Čia mes sukuriame „Class“ objekto objektą naudodami getClass()metodą. Naudodami objektą, mes vadiname skirtingais „Class“ metodais.

  • obj.getName () - grąžina klasės pavadinimą
  • obj.getModifiers () - grąžina klasės prieigos modifikatorių
  • obj.getSuperclass () - grąžina klasės super klasę

Norėdami sužinoti daugiau apie tai Class, apsilankykite „Java Class“ (oficiali „Java“ dokumentacija).

Pastaba : Mes naudojame Modifierklasę, norėdami konvertuoti sveikojo skaičiaus prieigos modifikatorių į eilutę.

Atspindintys laukai, metodai ir konstruktoriai

Pakete java.lang.reflectpateikiamos klasės, kurios gali būti naudojamos manipuliuojant klasės nariais. Pavyzdžiui,

  • Metodo klasė - pateikia informaciją apie metodus klasėje
  • Lauko klasė - teikia informaciją apie klasės laukus
  • Konstruktoriaus klasė - teikia informaciją apie konstruktorius klasėje

1. Java metodų atspindys

MethodKlasė teikia įvairius metodus, kurie gali būti naudojami gauti informaciją apie metodus metu klasėje. Pavyzdžiui,

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

Rezultatas

 Metodo pavadinimas: rodymo modifikatorius: viešas grąžinimo tipai: negaliojantis metodo pavadinimas: „makeSound“ modifikatorius: privatus grąžinimo tipai: negaliojantis

Ankstesniame pavyzdyje mes bandome gauti informacijos apie metodus, esančius šunų klasėje. Kaip minėta anksčiau, mes pirmiausia sukūrėme objekto objektą Classnaudoti getClass()metodą.

Atkreipkite dėmesį į išraišką,

 Method() methods = obj.getDeclaredMethod();

Čia getDeclaredMethod()pateikiami visi klasėje esantys metodai.

Be to, mes sukūrėme klasės objektą m Method. Čia

  • m.getName () - pateikia metodo pavadinimą
  • m.getModifiers () - pateikia metodo prieigos modifikatorių sveikojo skaičiaus pavidalu
  • m.getReturnType () - pateikia metodų grąžinimo tipą

MethodKlasę taip pat teikia įvairias kitus metodus, kurie gali būti naudojami patikrinti metodai vykdymo metu. Norėdami sužinoti daugiau, apsilankykite „Java Method“ klasėje (oficiali „Java“ dokumentacija).

2. Java laukų atspindys

Kaip ir metodai, mes taip pat galime patikrinti ir modifikuoti skirtingus klasės laukus, naudodami klasės metodus Field. Pavyzdžiui,

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

Rezultatas

 Vertė: labradoras Modifikatorius: viešas

Ankstesniame pavyzdyje mes sukūrėme klasę pavadinimu Šuo. Jame yra viešasis laukas, pavadintas tipas. Atkreipkite dėmesį į pareiškimą,

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

Čia mes prieiname prie Šuns klasės viešojo lauko ir priskiriame jį lauko lauko objekto laukui.

Tada mes naudojome įvairius Fieldklasės metodus :

  • field1.set () - nustato lauko vertę
  • field1.get () - grąžina lauko vertę
  • field1.getModifiers () - grąžina lauko vertę sveiko skaičiaus pavidalu

Panašiai mes taip pat galime pasiekti ir modifikuoti privačius laukus. Tačiau privataus lauko atspindys šiek tiek skiriasi nuo viešojo lauko. Pavyzdžiui,

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

Rezultatas

 Vertė: ruda Modifikatorius: privatus

Ankstesniame pavyzdyje mes sukūrėme klasę pavadinimu Šuo. Klasėje yra privatus laukas, pavadintas spalva. Atkreipkite dėmesį į teiginį.

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

Čia mes prieiname prie visų „Dog“ esančių konstruktorių ir priskiriame juos tokio Constructortipo masyvo konstruktoriams .

Tada mes naudojome objektą c, kad gautume skirtingą informaciją apie konstruktorių.

  • c.getName () - grąžina konstruktoriaus vardą
  • c.getModifiers () - grąžina konstruktoriaus prieigos modifikatorius sveikojo skaičiaus pavidalu
  • c.getParameterCount () - pateikia kiekvieno konstruktoriaus parametrų skaičių

Norėdami sužinoti daugiau apie šios Constructorklasės metodus , apsilankykite Konstruktoriaus klasėje

Įdomios straipsniai...