Java peegeldus (koos näidetega)

Selles õpetuses õpime peegeldust, Java-programmeerimise funktsiooni, mis võimaldab meil klasside, meetodite jms ülevaatamist ja muutmist.

Java-s võimaldab refleksioon kontrollida ja manipuleerida töötamise ajal klasse, liideseid, konstruktoreid, meetodeid ja välju.

Javas on olemas klass, mille nimi on Classkogu objektide ja klasside kohta käitusajal. Klassi objekti saab kasutada peegeldamiseks.

Java-klasside kajastamine

Java-klassi kajastamiseks peame kõigepealt looma klassi objekti.

Ja objekti abil saame kutsuda erinevaid meetodeid, et saada teavet klassis leiduvate meetodite, väljade ja konstruktorite kohta.

Klassi objektide loomiseks on kolm võimalust:

1. Kasutades meetodit forName ()

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

Siin forName()võtab meetod argumendiks klassi nime kajastamise.

2. Meetodi getClass () kasutamine

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

Siin kasutame klassi Objekti loomiseks koera objekti.

3. Laienduse .class kasutamine

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

Nüüd, kui me teame, kuidas saame luua objekti Class. Saame selle objekti abil saada vastava klassi kohta käitusajal teavet.

Näide: Java-klassi peegeldus

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

Väljund

 Nimi: koera modifitseerija: avalik superklass: loom

Ülaltoodud näites oleme loonud superklass: loom ja alaklass: koer. Siin proovime klassi Koera üle vaadata.

Pange tähele avaldust,

 Class obj = d1.getClass();

Siin loome getClass()meetodi abil klassi Obj objekti . Objekti kasutades kutsume klassi erinevaid meetodeid.

  • obj.getName () - tagastab klassi nime
  • obj.getModifiers () - tagastab klassi juurdepääsu modifikaatori
  • obj.getSuperclass () - tagastab klassi superklassi

Lisateabe saamiseks Classkülastage Java-klassi (ametlik Java-dokumentatsioon).

Märkus . Kasutame Modifierklassi täisarvu juurdepääsu modifikaatori teisendamiseks stringiks.

Peegeldavad väljad, meetodid ja konstruktorid

Pakett java.lang.reflectsisaldab klasse, mida saab kasutada klassi liikmetega manipuleerimiseks. Näiteks,

  • Meetodiklass - annab teavet klassis kasutatavate meetodite kohta
  • Väliklass - annab teavet klassi väljade kohta
  • Konstruktorite klass - annab teavet klassi konstruktorite kohta

1. Java-meetodite kajastamine

MethodKlassi pakub erinevaid meetodeid, mida saab kasutada, et saada teavet meetodite esinevad klassi. Näiteks,

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

Väljund

 Meetodi nimi: kuva muutja: avalik tagasitüübi tüüp: void

Ülalolevas näites püüame saada teavet koerte klassis kasutatavate meetodite kohta. Nagu varem mainitud, oleme kõigepealt loonud meetodi Classkasutamise objekti getClass().

Pange tähele väljendit

 Method() methods = obj.getDeclaredMethod();

Siin getDeclaredMethod()tagastatakse kõik klassi sees olevad meetodid.

Samuti oleme loonud Methodklassi objekti m . Siin,

  • m.getName () - tagastab meetodi nime
  • m.getModifiers () - tagastab meetodite juurdepääsu modifikaatori täisarvuna
  • m.getReturnType () - tagastab meetodite tagasituleku tüübi

MethodKlassi pakub ka mitmesuguseid muid meetodeid, mida saab kasutada, et kontrollida meetodid töötamise ajal. Lisateabe saamiseks külastage Java Methodi klassi (ametlik Java dokumentatsioon).

2. Java väljade kajastamine

Sarnaselt meetoditega saame ka klassi erinevaid välju kontrollida ja modifitseerida, kasutades klassi meetodeid Field. Näiteks,

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

Väljund

 Väärtus: labrador Muutuja: avalik

Ülaltoodud näites oleme loonud klassi nimega Koer. See sisaldab avalikku välja nimega tüüp. Pange tähele avaldust,

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

Siin pääseme juurde kõigile Dogis leiduvatele konstruktoritele ja määrame need seda Constructortüüpi massiivkonstruktoritele.

Seejärel kasutasime objekti c abil erinevat teavet konstruktori kohta.

  • c.getName () - tagastab konstruktori nime
  • c.getModifiers () - tagastab konstruktori juurdepääsu modifikaatorid täisarvuna
  • c.getParameterCount () - tagastab igas konstruktoris olevate parameetrite arvu

Tunni teiste meetodite kohta Constructorlisateabe saamiseks külastage Constructor klassi

Huvitavad Artiklid...