Refleksi Java (Dengan Contoh)

Dalam tutorial ini, kita akan belajar refleksi, sebuah fitur dalam pengaturcaraan Java yang memungkinkan kita memeriksa dan mengubah kelas, kaedah, dll.

Di Jawa, refleksi memungkinkan kita memeriksa dan memanipulasi kelas, antara muka, konstruktor, kaedah, dan medan pada waktu berjalan.

Terdapat kelas di Java bernama Classyang menyimpan semua maklumat mengenai objek dan kelas pada waktu runtime. Objek Kelas boleh digunakan untuk melakukan refleksi.

Refleksi Kelas Java

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

Dan, dengan menggunakan objek tersebut kita dapat memanggil pelbagai kaedah untuk mendapatkan maklumat mengenai kaedah, medan, dan pembangun yang ada di dalam kelas.

Terdapat tiga cara untuk membuat objek Kelas:

1. Menggunakan kaedah forName ()

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

Di sini, forName()kaedah mengambil nama kelas untuk dicerminkan sebagai hujahnya.

2. Menggunakan kaedah 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 Anjing untuk membuat objek Kelas.

3. Menggunakan peluasan .class

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

Sekarang kita tahu bagaimana kita dapat membuat objek dari Class. Kita boleh menggunakan objek ini untuk mendapatkan maklumat mengenai kelas yang sesuai pada waktu 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(); ) ) )

Pengeluaran

 Nama: Pengubah Anjing: Superclass awam: Haiwan

Dalam contoh di atas, kami telah mencipta superclass: Animal dan subclass: Dog. Di sini, kami cuba memeriksa Dog kelas.

Perhatikan kenyataannya,

 Class obj = d1.getClass();

Di sini, kami membuat objek objek Kelas menggunakan getClass()kaedah. Dengan menggunakan objek, kami memanggil kaedah yang berbeza dari Kelas.

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

Untuk mengetahui lebih lanjut mengenai Class, kunjungi Java Class (dokumentasi Java rasmi).

Catatan : Kami menggunakan Modifierkelas untuk menukar pengubah akses integer menjadi rentetan.

Mencerminkan Medan, Kaedah, dan Konstruktor

Pakej ini java.lang.reflectmenyediakan kelas yang boleh digunakan untuk memanipulasi ahli kelas. Sebagai contoh,

  • Kelas kaedah - memberikan maklumat mengenai kaedah dalam kelas
  • Kelas lapangan - memberikan maklumat mengenai bidang dalam kelas
  • Kelas konstruktor - memberikan maklumat mengenai pembina dalam kelas

1. Refleksi Kaedah Java

The Methodkelas menyediakan pelbagai kaedah yang boleh digunakan untuk mendapatkan maklumat tentang kaedah di dalam 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(); ) ) )

Pengeluaran

 Nama Kaedah: paparan Pengubah: umum Jenis Pengembalian: tidak sah Nama Kaedah: makeSound Modifier: peribadi Jenis Pengembalian: tidak sah

Dalam contoh di atas, kami berusaha mendapatkan maklumat mengenai kaedah yang ada di kelas Anjing. Seperti disebutkan sebelumnya, kami pertama kali membuat obyek obj Classmenggunakan getClass()kaedah.

Perhatikan ungkapan,

 Method() methods = obj.getDeclaredMethod();

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

Kami juga telah membuat objek Methodkelas. Di sini,

  • m.getName () - mengembalikan nama kaedah
  • m.getModifiers () - mengembalikan kaedah pengubah akses dalam bentuk integer
  • m.getReturnType () - mengembalikan kaedah kaedah kembali

The Methodkelas juga menyediakan pelbagai kaedah lain yang boleh digunakan untuk memeriksa kaedah pada masa jalanan. Untuk mengetahui lebih lanjut, kunjungi kelas Kaedah Java (dokumentasi Java rasmi).

2. Refleksi Medan Jawa

Seperti kaedah, kita juga dapat memeriksa dan mengubahsuai bidang yang berbeza dari kelas menggunakan kaedah 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(); ) ) )

Pengeluaran

 Nilai: labrador Pengubah: awam

Dalam contoh di atas, kami telah membuat kelas bernama Dog. Ini merangkumi bidang awam bernama jenis. Perhatikan kenyataannya,

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

Di sini, kami mengakses medan umum kelas Dog dan memberikannya ke bidang objek1 dari kelas Field.

Kami kemudian menggunakan pelbagai kaedah Fieldkelas:

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

Begitu juga, kita juga dapat mengakses dan mengubah suai bidang peribadi. Namun, refleksi bidang swasta sedikit berbeza daripada bidang awam. 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(); ) ) )

Pengeluaran

 Nilai: coklat Pengubah: peribadi

Dalam contoh di atas, kami telah membuat kelas bernama Dog. Kelas mengandungi medan peribadi bernama warna. Perhatikan penyataannya.

 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 memberikannya kepada array konstruktor Constructorjenis ini.

Kami kemudian menggunakan objek c untuk mendapatkan maklumat yang berbeza mengenai pembina.

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

Untuk mengetahui lebih banyak kaedah Constructorkelas, lawati kelas Pembina

Artikel menarik...