Menguasai Refleksi Java: Memeriksa Kelas, Metode, dan Field pada Waktu Eksekusi
Menguasai Refleksi Java
Pelajari bagaimana API refleksi Java memungkinkan Anda memeriksa dan memodifikasi kelas, metode, field, dan konstruktor selama runtime, meningkatkan fleksibilitas dan memungkinkan perilaku dinamis yang canggih.
Di Java, refleksi memungkinkan Anda untuk memeriksa dan memanipulasi kelas, antarmuka, konstruktor, metode, dan field sementara program berjalan.
Java menyediakan kelas Class, yang mengenkapsulasi metadata tentang kelas atau antarmuka. Sebuah instance Class adalah pintu gerbang ke kemampuan refleksi.
Mendapatkan Objek Class
Untuk melakukan refleksi, Anda pertama-tama memerlukan objek Class. Ada tiga cara umum untuk mendapatkannya:
- Menggunakan
Class.forName() Class<Dog> clazz = Class.forName("com.example.Dog");
Metode ini menerima nama kelas yang lengkap dan memuat kelas jika belum dimuat.
- Menggunakan
getClass() pada instance Dog dog = new Dog(); Class<Dog> clazz = dog.getClass();
Mengambil kelas runtime dari objek.
- Menggunakan literal
.class Class<Dog> clazz = Dog.class;
Menyediakan referensi waktu kompilasi ke objek Class.
Setelah Anda memiliki instance Class, Anda dapat memeriksa metode, field, konstruktor, dan anotasi-nya.
Contoh Praktis: Memeriksa Kelas Dog
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Dog extends Animal { public void display() { System.out.println("Saya adalah seekor anjing."); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); System.out.println("Nama: " + clazz.getName()); System.out.println("Modifier: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclass: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
Output
Nama: com.example.Dog Modifier: public Superclass: com.example.Animal
Dalam cuplikan ini, kita membuat instance Dog, mendapatkan objek Class-nya, dan memeriksa nama kelas, access modifier, dan superclass.
Untuk wawasan lebih dalam tentang Class, konsultasikan dokumentasi resmi Java Class.
Menjelajahi Field, Metode, dan Konstruktor
Paket java.lang.reflect menawarkan kelas khusus untuk introspeksi anggota tertentu:
Method – detail tentang metode. Field – detail tentang field. Constructor – detail tentang konstruktor.
Refleksi Metode
Kelas Method mengekspos metadata seperti nama, tipe pengembalian, dan modifier. Di bawah ini adalah contoh ringkas:
import java.lang.reflect.*; class Dog { public void display() { System.out.println("Saya adalah seekor anjing."); } private void makeSound() { System.out.println("Guk Guk"); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Method[] methods = dog.getClass().getDeclaredMethods(); for (Method m : methods) { System.out.println("Nama Metode: " + m.getName()); System.out.println("Modifier: " + Modifier.toString(m.getModifiers())); System.out.println("Tipe Kembali: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Output
Nama Metode: display Modifier: public Tipe Kembali: void Nama Metode: makeSound Modifier: private Tipe Kembali: void
Untuk daftar lengkap utilitas Method, kunjungi dokumentasi resmi Method.
Refleksi Field
Field dapat diakses dan dimodifikasi pada waktu runtime. Kelas Field menyediakan utilitas get, set, dan modifier. Contoh:
import java.lang.reflect.*; class Dog { public String type; private String color; } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); // Public field Field typeField = clazz.getField("type"); typeField.set(dog, "labrador"); System.out.println("Nilai: " + typeField.get(dog)); System.out.println("Modifier: " + Modifier.toString(typeField.getModifiers())); // Private field Field colorField = clazz.getDeclaredField("color"); colorField.setAccessible(true); colorField.set(dog, "cokelat"); System.out.println("Nilai: " + colorField.get(dog)); System.out.println("Modifier: " + Modifier.toString(colorField.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
Output
Nilai: labrador Modifier: public Nilai: cokelat Modifier: private
Jelajahi dokumentasi kelas Field untuk penggunaan lanjutan.
Refleksi Konstruktor
Konsturktor diintrospeksi melalui kelas Constructor. Kode berikut mencantumkan semua konstruktor dari Dog:
import java.lang.reflect.*; class Dog { public Dog() {} private Dog(int age) {} } public class Main { public static void main(String[] args) { try { Constructor<Dog>[] cons = Dog.class.getDeclaredConstructors(); for (Constructor<Dog> c : cons) { System.out.println("Nama Konstruktor: " + c.getName()); System.out.println("Modifier: " + Modifier.toString(c.getModifiers())); System.out.println("Parameter: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Output
Nama Konstruktor: Dog Modifier: public Parameter: 0 Nama Konstruktor: Dog Modifier: private Parameter: 1
Untuk detail lebih lanjut, lihat dokumentasi Constructor.