Java Reflection (s primjerima)

U ovom uputstvu naučit ćemo refleksiju, značajku u Java programiranju koja nam omogućuje pregled i izmjenu klasa, metoda itd.

U Javi nam refleksija omogućuje pregled i manipulaciju klasama, sučeljima, konstruktorima, metodama i poljima u vrijeme izvođenja.

Postoji klasa na Javi Classkoja nosi sve podatke o objektima i klasama tijekom izvođenja. Objekt klase može se koristiti za izvođenje refleksije.

Odraz Java klasa

Da bismo odražavali Java klasu, prvo moramo stvoriti objekt klase.

I, koristeći objekt, možemo pozvati razne metode kako bismo dobili informacije o metodama, poljima i konstruktorima prisutnim u klasi.

Postoje tri načina za stvaranje predmeta klase:

1. Uporabom metode forName ()

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

Ovdje forName()metoda uzima naziv klase da bi se odrazila kao njen argument.

2. Korištenjem metode getClass ()

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

Ovdje koristimo objekt klase Dog da bismo stvorili objekt klase.

3. Korištenje .class ekstenzije

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

Sad kad znamo kako možemo stvarati objekte Class. Ovaj objekt možemo koristiti za dobivanje informacija o odgovarajućoj klasi tijekom izvođenja.

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

Izlaz

 Naziv: Modifikator psa: javni Superklasa: Životinja

U gornjem primjeru stvorili smo superrazred: Životinja i podrazred: Pas. Ovdje pokušavamo pregledati razred Psa.

Primijetite izjavu,

 Class obj = d1.getClass();

Ovdje stvaramo objekt obj od Class koristeći getClass()metodu. Koristeći objekt, pozivamo različite metode klase.

  • obj.getName () - vraća ime klase
  • obj.getModifiers () - vraća modifikator pristupa klasi
  • obj.getSuperclass () - vraća super klasu klase

Da biste saznali više o tome Class, posjetite Java Class (službena Java dokumentacija).

Napomena : ModifierKlasu koristimo za pretvaranje cjelobrojnog modifikatora pristupa u niz.

Odražavanje polja, metoda i konstruktora

Paket java.lang.reflectnudi klase koje se mogu koristiti za manipulaciju članovima klase. Na primjer,

  • Klasa metoda - pruža informacije o metodama u klasi
  • Razred polja - pruža informacije o poljima u klasi
  • Klasa konstruktora - pruža informacije o konstruktorima u klasi

1. Refleksija Java metoda

Predavanje Methodnudi razne metode koje se mogu koristiti za dobivanje informacija o metodama prisutnim u klasi. Na primjer,

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

Izlaz

 Naziv metode: modifikator prikaza: javni Tipovi povrata: void Naziv metode: makeSound Modifikator: privatni Tipovi povrata: void

U gornjem primjeru pokušavamo dobiti informacije o metodama prisutnim u klasi Pas. Kao što je ranije spomenuto, prvo smo stvorili objekt obj Classkorištenja getClass()metode.

Primijetite izraz,

 Method() methods = obj.getDeclaredMethod();

Ovdje getDeclaredMethod()vraća sve metode prisutne unutar klase.

Također, stvorili smo objekt m Methodklase. Ovdje,

  • m.getName () - vraća ime metode
  • m.getModifiers () - vraća modifikator pristupa metodama u cjelobrojnom obliku
  • m.getReturnType () - vraća povratnu vrstu metoda

MethodRazred također pruža razne druge metode koje se mogu koristiti da provjerite metode u vrijeme izvođenja. Da biste saznali više, posjetite klasu Java metoda (službena Java dokumentacija).

2. Odraz Java polja

Kao i metode, također možemo pregledavati i mijenjati različita polja klase koristeći metode Fieldklase. Na primjer,

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

Izlaz

 Vrijednost: labrador Modifikator: javni

U gornjem primjeru stvorili smo klasu Pas. Sadrži javno polje s imenom tipa. Primijetite izjavu,

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

Ovdje pristupamo svim konstruktorima prisutnim u Pasu i dodjeljujemo ih konstruktorima niza Constructortipa.

Zatim smo koristili objekt c da bismo dobili različite informacije o konstruktoru.

  • c.getName () - vraća ime konstruktora
  • c.getModifiers () - vraća modifikatore pristupa konstruktora u cjelobrojnom obliku
  • c.getParameterCount () - vraća broj parametara prisutnih u svakom konstruktoru

Da biste saznali više o metodama Constructorklase, posjetite klasu Konstruktor

Zanimljivi članci...