Java-heijastus (esimerkkejä)

Tässä opetusohjelmassa opitaan pohdintaa, Java-ohjelmoinnin ominaisuutta, jonka avulla voimme tarkastaa ja muokata luokkia, menetelmiä jne.

Java-tilassa pohdinta antaa meille mahdollisuuden tarkastaa ja käsitellä luokkia, rajapintoja, rakentajia, menetelmiä ja kenttiä ajon aikana.

Java-luokassa on nimeltään luokka, Classjoka pitää kaikki tiedot esineistä ja luokista ajon aikana. Luokan kohdetta voidaan käyttää heijastamiseen.

Java-luokkien heijastus

Java-luokan heijastamiseksi meidän on ensin luotava luokan objekti.

Ja objektin avulla voimme kutsua erilaisia ​​menetelmiä saadaksesi tietoa luokassa olevista menetelmistä, kentistä ja konstruktoreista.

Luokan objektien luomiseen on kolme tapaa:

1. Käyttämällä forName () -menetelmää

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

Tällöin forName()menetelmä ottaa luokan nimen näkyvän argumenttinaan.

2. Käytä getClass () -menetelmää

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

Tässä käytämme Koira-luokan kohdetta luodaksesi luokan objektin.

3. Käyttämällä .class-laajennusta

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

Nyt kun tiedämme kuinka voimme luoda Class. Voimme käyttää tätä objektia saadaksesi tietoja vastaavasta luokasta ajon aikana.

Esimerkki: Java-luokan heijastus

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

Tuotos

 Nimi: Koiran muokkaaja: julkinen superluokka: Eläin

Edellä olevassa esimerkissä olemme luoneet superluokan: eläin ja aliluokan: koira. Täällä yritämme tarkastaa luokan Koira.

Huomaa lausunto,

 Class obj = d1.getClass();

Tässä luomme luokan objektin objektin getClass()menetelmällä. Objektin avulla kutsumme erilaisia ​​luokan menetelmiä.

  • obj.getName () - palauttaa luokan nimen
  • obj.getModifiers () - palauttaa luokan pääsymuuttujan
  • obj.getSuperclass () - palauttaa luokan superluokan

Saat lisätietoja Classvierailemalla Java-luokassa (virallinen Java-dokumentaatio).

Huomaa : Käytämme Modifierluokkaa muuntamaan kokonaisluvun käyttömuokkaus merkkijonoksi.

Heijastavat kentät, menetelmät ja rakentajat

Paketti java.lang.reflecttarjoaa luokkia, joita voidaan käyttää luokan jäsenten manipulointiin. Esimerkiksi,

  • Menetelmäluokka - antaa tietoa luokan menetelmistä
  • Kenttäluokka - antaa tietoja luokan kentistä
  • Rakentajaluokka - antaa tietoa luokan rakentajista

1. Java-menetelmien heijastus

MethodLuokka tarjoaa erilaisia menetelmiä, joita voidaan käyttää saamaan tietoa menetelmistä esillä olevan luokan. Esimerkiksi,

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

Tuotos

 Menetelmän nimi: näytön muokkaaja: julkinen palautustyyppi: void Menetelmän nimi: makeSound-muokkaus: yksityinen palautustyyppi: void

Yllä olevassa esimerkissä yritämme saada tietoa koiraluokan menetelmistä. Kuten aiemmin mainittiin, olemme ensin luoneet objektin objektin Classkäyttämällä getClass()menetelmää.

Huomaa ilmaisu,

 Method() methods = obj.getDeclaredMethod();

Tässä getDeclaredMethod()palautetaan kaikki luokan sisällä olevat menetelmät.

Olemme myös luoneet objektin m Methodluokassa. Tässä,

  • m.getName () - palauttaa menetelmän nimen
  • m.getModifiers () - palauttaa menetelmien käyttömuokkaimen kokonaislukumuodossa
  • m.getReturnType () - palauttaa menetelmien palautustyypin

MethodLuokka tarjoaa myös useita muita menetelmiä, joita voidaan käyttää tarkastaa menetelmien suorituksen aikana. Lisätietoja on Java Method -luokassa (virallinen Java-dokumentaatio).

2. Java-kenttien heijastus

Kuten menetelmiä, voimme myös tarkastaa ja muokata luokan eri kenttiä luokan menetelmillä Field. Esimerkiksi,

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

Tuotos

 Arvo: labradorinnoutaja Muuttaja: julkinen

Yllä olevassa esimerkissä olemme luoneet luokan nimeltä Koira. Se sisältää julkisen kentän, jonka nimi on tyyppi. Huomaa lausunto,

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

Tässä pääsemme kaikkiin Dogissa oleviin konstruktoreihin ja osoitamme ne tämän Constructortyyppisille matriisirakentajille .

Sitten käytimme objektia c saadaksemme erilaisia ​​tietoja konstruktorista.

  • c.getName () - palauttaa rakentajan nimen
  • c.getModifiers () - palauttaa konstruktorin pääsymodifikaattorit kokonaislukuna
  • c.getParameterCount () - palauttaa kussakin konstruktorissa olevien parametrien lukumäärän

Saat lisätietoja Constructorluokan menetelmistä käymällä Rakentaja-luokassa

Mielenkiintoisia artikkeleita...