Java Reflection (Dengan Contoh)

Dalam tutorial ini, kita akan belajar refleksi, sebuah fitur dalam pemrograman Java yang memungkinkan kita untuk memeriksa dan memodifikasi kelas, metode, dll.

Di Java, refleksi memungkinkan kita untuk memeriksa dan memanipulasi kelas, antarmuka, konstruktor, metode, dan bidang pada waktu proses.

Ada sebuah kelas di Java bernama Classyang menyimpan semua informasi tentang objek dan kelas pada saat runtime. Objek Kelas dapat digunakan untuk melakukan refleksi.

Refleksi Kelas Java

Untuk mencerminkan kelas Java, pertama-tama kita perlu membuat objek Kelas.

Dan, dengan menggunakan objek kita bisa memanggil berbagai metode untuk mendapatkan informasi tentang metode, bidang, dan konstruktor yang ada di kelas.

Ada tiga cara untuk membuat objek Kelas:

1. Menggunakan metode forName ()

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

Di sini, forName()metode mengambil nama kelas untuk direfleksikan sebagai argumennya.

2. Menggunakan metode getClass ()

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

Di sini, kami menggunakan objek kelas Dog untuk membuat objek Kelas.

3. Menggunakan ekstensi .class

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

Sekarang kita tahu bagaimana kita bisa membuat objek dari Class. Kita bisa menggunakan objek ini untuk mendapatkan informasi tentang kelas yang sesuai saat runtime.

Contoh: Refleksi Kelas Java

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

Keluaran

 Nama: Pengubah Anjing: Kelas Super publik: Hewan

Dalam contoh di atas, kami telah membuat superclass: Animal dan subclass: Dog. Di sini, kami mencoba untuk memeriksa Anjing kelas.

Perhatikan pernyataannya,

 Class obj = d1.getClass();

Di sini, kami membuat objek objek Kelas menggunakan getClass()metode. Menggunakan objek, kami memanggil metode Kelas yang berbeda.

  • obj.getName () - mengembalikan nama kelas
  • obj.getModifiers () - mengembalikan pengubah akses kelas
  • obj.getSuperclass () - mengembalikan kelas super kelas

Untuk mempelajari lebih lanjut Class, kunjungi Kelas Java (dokumentasi resmi Java).

Catatan : Kami menggunakan Modifierkelas untuk mengonversi pengubah akses integer menjadi string.

Mencerminkan Bidang, Metode, dan Pembangun

Paket ini java.lang.reflectmenyediakan kelas yang dapat digunakan untuk memanipulasi anggota kelas. Sebagai contoh,

  • Kelas metode - memberikan informasi tentang metode di kelas
  • Kelas lapangan - memberikan informasi tentang bidang di kelas
  • Kelas konstruktor - memberikan informasi tentang konstruktor di kelas

1. Refleksi Metode Java

The Methodkelas menyediakan berbagai metode yang dapat digunakan untuk mendapatkan informasi tentang metode hadir di kelas. Sebagai contoh,

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

Keluaran

 Nama Metode: tampilan Pengubah: publik Jenis Pengembalian: void Nama Metode: makeSound Modifier: pribadi Jenis Pengembalian: void

Dalam contoh di atas, kami mencoba mendapatkan informasi tentang metode yang ada di kelas Anjing. Seperti yang disebutkan sebelumnya, pertama-tama kami membuat objek objek Classmenggunakan getClass()metode ini.

Perhatikan ekspresinya,

 Method() methods = obj.getDeclaredMethod();

Di sini, getDeclaredMethod()mengembalikan semua metode yang ada di dalam kelas.

Juga, kami telah membuat objek m Methodkelas. Sini,

  • m.getName () - mengembalikan nama metode
  • m.getModifiers () - mengembalikan pengubah akses metode dalam bentuk integer
  • m.getReturnType () - mengembalikan tipe metode yang dikembalikan

The Methodkelas juga menyediakan berbagai metode lain yang dapat digunakan untuk memeriksa metode pada saat dijalankan. Untuk mempelajari lebih lanjut, kunjungi kelas Metode Java (dokumentasi resmi Java).

2. Refleksi Bidang Jawa

Seperti metode, kita juga dapat memeriksa dan memodifikasi berbagai bidang kelas menggunakan metode Fieldkelas. Sebagai contoh,

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

Keluaran

 Nilai: labrador Modifier: publik

Dalam contoh di atas, kami telah membuat kelas bernama Dog. Ini mencakup jenis nama bidang publik. Perhatikan pernyataannya,

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

Di sini, kita mengakses bidang publik dari kelas Anjing dan menugaskannya ke bidang objek1 dari kelas Bidang.

Kami kemudian menggunakan berbagai metode Fieldkelas:

  • field1.set () - menetapkan nilai bidang
  • field1.get () - mengembalikan nilai bidang
  • field1.getModifiers () - mengembalikan nilai bidang dalam bentuk integer

Demikian pula, kami juga dapat mengakses dan mengubah bidang pribadi. Namun, refleksi dari bidang privat sedikit berbeda dengan bidang publik. Sebagai contoh,

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

Keluaran

 Nilai: coklat Pengubah: pribadi

Dalam contoh di atas, kami telah membuat kelas bernama Dog. Kelas berisi bidang pribadi bernama warna. Perhatikan pernyataannya.

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

Di sini, kita mengakses semua konstruktor yang ada di Dog dan menugaskannya ke konstruktor array dari Constructortipe tersebut.

Kami kemudian menggunakan objek c untuk mendapatkan informasi berbeda tentang konstruktor.

  • c.getName () - mengembalikan nama konstruktor
  • c.getModifiers () - mengembalikan pengubah akses konstruktor dalam bentuk integer
  • c.getParameterCount () - mengembalikan jumlah parameter yang ada di setiap konstruktor

Untuk mempelajari lebih banyak metode Constructorkelas, kunjungi kelas Pembuat

Artikel yang menarik...