Menguasai Java Reflection API: Panduan Praktis dengan Contoh Kode
Apa Itu Reflection di Java?
Java Reflection adalah proses menganalisis dan memodifikasi semua kemampuan sebuah kelas pada waktu proses. Reflection API di Java digunakan untuk memanipulasi kelas dan anggotanya yang meliputi field, metode, konstruktor, dll. pada waktu proses.
Salah satu keuntungan Reflection API di Java adalah ia dapat memanipulasi anggota privat dari kelas juga.
Paket java.lang.reflect menyediakan banyak kelas untuk mengimplementasikan reflection di Java. Metode dari kelas java.lang.Class digunakan untuk mengumpulkan metadata lengkap dari kelas tertentu.
Dalam tutorial ini, Anda akan mempelajari-
Apa itu Reflection
Kelas di Paket java.lang.reflect
Metode yang digunakan di java.lang.Class
Bagaimana mendapatkan informasi lengkap tentang kelas
Contoh 1: Cara Mendapatkan Metadata Kelas
Contoh 2: Cara Mendapatkan Metadata Variabel
Contoh 3: Cara Mendapatkan Metadata Metode
Contoh 4: Cara Mendapatkan Metadata Konstruktor
Kelas di Paket java.lang.reflect
Berikut adalah daftar berbagai kelas Java di paket java.lang.reflect untuk mengimplementasikan reflection-
Field: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti tipe data, modifier akses, nama, dan nilai variabel.
Method: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti modifier akses, tipe kembalian, nama, tipe parameter, dan tipe exception dari sebuah metode.
Constructor: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti modifier akses, nama, dan tipe parameter dari konstruktor.
Modifier: Kelas ini digunakan untuk mengumpulkan informasi tentang modifier akses tertentu.
Metode yang Digunakan di java.lang.Class
Public String getName (): Mengembalikan nama kelas.
public Class getSuperclass(): Mengembalikan referensi superclass
Public Class[] getInterfaces() : Mengembalikan array antarmuka yang diimplementasikan oleh kelas yang ditentukan
Public int getModifiers (): Mengembalikan nilai integer yang mewakili modifier dari kelas yang ditentukan yang perlu diteruskan sebagai parameter ke metode public static String toString (int i) yang mengembalikan specifier akses untuk kelas yang diberikan.
Bagaimana Mendapatkan Informasi Lengkap tentang Kelas
Untuk mendapatkan informasi tentang variabel, metode, dan konstruktor dari kelas, kita perlu membuat objek dari kelas tersebut.
public class Guru99ClassObjectCreation { public static void main (String[] args) throws ClassNotFoundException { //1 - Dengan menggunakan metode Class.forname() Class c1 = Class.forName("Guru99ClassObjectCreation"); //2- Dengan menggunakan metode getClass() Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); //3- Dengan menggunakan .class Class c3= Guru99ClassObjectCreation.class; } }
Contoh berikut menunjukkan cara berbeda untuk membuat objek dari kelas "class":
Contoh 1 : Cara Mendapatkan Metadata Kelas
Contoh berikut menunjukkan cara mendapatkan metadata seperti: Nama kelas, nama superclass, antarmuka yang diimplementasikan, dan modifier akses dari sebuah kelas.
Kita akan mendapatkan metadata dari kelas bernama Guru99Base.class di bawah ini:
import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { }
Nama kelas adalah: Guru99Base
Modifier aksesnya adalah: public dan abstract
Ia telah mengimplementasikan antarmuka: Serializable dan Cloneable
Karena ia tidak memperluas kelas apa pun secara eksplisit, superclassnya adalah: java.lang.Object
Kelas di bawah ini akan mendapatkan metadata dari Guru99Base.class dan mencetaknya:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // Buat objek Class untuk Guru99Base.class Class<Guru99Base> guru99ClassObj = Guru99Base.class; // Cetak nama kelas System.out.println("Nama kelas adalah : " + guru99ClassObj.getName()); // Cetak nama superclass System.out.println("Nama superclass adalah : " + guru99ClassObj.getSuperclass().getName()); // Dapatkan daftar antarmuka yang diimplementasikan dalam bentuk array Class menggunakan getInterface() Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Cetak antarmuka yang diimplementasikan menggunakan foreach loop System.out.print("Antarmuka yang diimplementasikan adalah : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); //Dapatkan modifier akses menggunakan get Modifiers() method dan toString() method dari java.lang.reflect.Modifier class int guru99AccessModifier= guru99ClassObj.getModifiers(); // Cetak modifier akses System.out.println("Modifier akses dari kelas adalah : " + Modifier.toString(guru99AccessModifier)); } }
cetak nama kelas menggunakan metode getName
Cetak nama superclass menggunakan getSuperClass().getName() method
Cetak nama antarmuka yang diimplementasikan
Cetak modifier akses yang digunakan oleh kelas
Contoh 2 : Cara Mendapatkan Metadata Variabel
Contoh berikut menunjukkan cara mendapatkan metadata variabel:
Di sini, kita membuat kelas bernama Guru99VariableMetaData.class dengan beberapa variabel:
package guru; public class Guru99VariableMetaData { public static int guru99IntVar1=1111; static int guru99IntVar2=2222; static String guru99StringVar1="guru99.com"; static String guru99StringVar2="Learning Reflection API"; }
Langkah-langkah untuk mendapatkan metadata tentang variabel di kelas di atas:
Buat objek class dari kelas di atas yaitu Guru99VariableMetaData.class sebagai berikut:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
Dapatkan metadata dalam bentuk array field menggunakan metode getFields() atau getDeclaredFields() sebagai berikut:
getFields() mengembalikan metadata variabel public dari kelas yang ditentukan serta dari superclassnya.
getDeclaredFields() mengembalikan metadata semua variabel dari kelas yang ditentukan saja.
Dapatkan nama variabel menggunakan metode "public String getName()".
Dapatkan tipe data variabel menggunakan "public Class getType()" method.
Dapatkan nilai variabel menggunakan "public xxx get (Field)" method.
Di sini, xxx bisa byte atau short atau tipe nilai apa pun yang ingin kita ambil.
Dapatkan modifier akses variabel menggunakan getModifier() dan Modifier.toString(int i) methods.
Di sini, kita menulis kelas untuk mendapatkan metadata variabel yang ada di kelas Guru99VariableMetaData.class:
package guru; import java.lang.reflect.Field; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Buat objek Class untuk Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Dapatkan metadata semua field dari kelas Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Cetak nama, tipe data, modifier akses, dan nilai variabel dari kelas yang ditentukan for(Field field : guru99Field1) { System.out.println("Nama variabel : "+field.getName()); System.out.println("Tipe data variabel :"+field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.print("Modifier Akses variabel : "+Modifier.toString(guru99AccessModifiers)); System.out.println("Nilai variabel : "+field.get(guru99ClassVar)); System.out.println(); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } }
Membuat objek class untuk Guru99VariableMetaData.class
Mendapatkan semua metadata variabel dalam array Field
Mencetak semua nama variabel di kelas Guru99VariableMetaData.class
Mencetak semua tipe data variabel di kelas Guru99VariableMetaData.class
Mencetak semua modifier akses variabel di kelas Guru99VariableMetaData.class
Mencetak nilai semua variabel di kelas Guru99VariableMetaData.class
Contoh 3 : Cara Mendapatkan Metadata Metode
Contoh berikut menunjukkan cara mendapatkan metadata metode:
Di sini, kita membuat kelas bernama Guru99MethodMetaData.class dengan beberapa metode
package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void guru99Add(int firstElement, int secondElement , String result) throws ClassNotFoundException, ClassCastException{ System.out.println("Demo method untuk Reflection API"); } public String guru99Search(String searchString) throws ArithmeticException, InterruptedException{ System.out.println("Demo method untuk Reflection API"); return null; } public void guru99Delete(String deleteString) throws SQLException{ System.out.println("Demo method untuk Reflection API"); } }
Langkah-langkah untuk mendapatkan metadata tentang metode di kelas di atas :
Buat objek class dari kelas di atas yaitu Guru99MethodMetaData.class sebagai berikut:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
Dapatkan informasi metode dalam array Method menggunakan getMethods() dan getDeclaredMethods() sebagai berikut:
getMethods() mengembalikan metadata metode public dari kelas yang ditentukan serta dari superclassnya.
getDeclaredMethods() mengembalikan metadata semua metode dari kelas yang ditentukan saja.
Dapatkan nama metode menggunakan getName() method.
Dapatkan tipe kembali metode menggunakan getReturnType() method.
Dapatkan modifier akses metode menggunakan getModifiers() dan Modifier.toString(int i) methods.
Dapatkan tipe parameter metode menggunakan getParameterTypes() method yang mengembalikan array class.
Dapatkan exception yang dilemparkan menggunakan getExceptionTypes() method yang mengembalikan array class.
Di sini, kita menulis kelas untuk mendapatkan metadata metode yang ada di kelas Guru99MethodMetaData.class:
package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodMetaDataTest { public static void main (String[] args) { // Buat objek Class untuk Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Dapatkan metadata atau informasi semua metode dari kelas menggunakan getDeclaredMethods() Method[] guru99Methods=guru99ClassObj.getDeclaredMethods(); for(Method method : guru99Methods) { // Cetak nama metode System.out.println("Nama metode : "+method.getName()); // Cetak tipe kembali metode System.out.println("Tipe kembali metode : "+method.getReturnType()); //Dapatkan daftar modifier akses dan cetak int guru99ModifierList = method.getModifiers(); System.out.println("Modifier akses metode : "+Modifier.toString(guru99ModifierList)); // Dapatkan dan cetak parameter metode Class[] guru99ParamList= method.getParameterTypes(); System.out.print("Tipe parameter metode : "); for (Class class1 : guru99ParamList){ System.out.print(class1.getName()+" "); } System.out.println(); // Dapatkan dan cetak exception yang dilemparkan metode Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception yang dilemparkan oleh metode :"); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() +" "); } System.out.println(); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "); } } }
Membuat objek class untuk Guru99MethodMetaData.class
Mendapatkan semua metadata metode dalam array Method
Mencetak semua nama metode yang ada di kelas Guru99MethodMetaData.class
Mencetak tipe kembali metode di kelas Guru99MethodMetaData.class
Mencetak semua modifier akses metode di kelas Guru99MethodMetaData.class
Mencetak tipe parameter metode di Guru99MethodMetaData.class
Mencetak exception yang dilemparkan oleh metode di Guru99MethodMetaData.class
Contoh 4 : Cara Mendapatkan Metadata Konstruktor
Contoh berikut menunjukkan cara mendapatkan metadata konstruktor:
Di sini, kita membuat kelas bernama Guru99Constructor.class dengan berbagai konstruktor:
package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException ,ArithmeticException{ } public Guru99Constructor(int no, String name) throws RemoteException ,SQLException{ } public Guru99Constructor(int no, String name, String address) throws InterruptedException{ } }
Di sini, kita menulis kelas untuk mendapatkan metadata konstruktor yang ada di kelas Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; public class Guru99ConstructorMetaDataTest { public static void main (String[] args) { // Buat objek Class untuk Guru99Constructor.class Class guru99Class=Guru99Constructor.class; // Dapatkan semua informasi konstruktor dalam array Constructor Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { // Cetak nama setiap konstruktor System.out.println("Nama konstruktor : "+constructor.getName()); //Dapatkan dan cetak modifier akses setiap konstruktor int guru99Modifiers= constructor.getModifiers(); System.out.println("Modifier konstruktor : "+Modifier.toString(guru99Modifiers)); // Dapatkan dan cetak tipe parameter Class[] guru99ParamList=constructor.getParameterTypes(); System.out.print ("Tipe parameter konstruktor :"); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() +" "); } System.out.println(); // Dapatkan dan cetak exception yang dilemparkan konstruktor Class[] guru99ExceptionList=constructor.getExceptionTypes(); System.out.println("Exception yang dilemparkan oleh konstruktor :"); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() +" "); } System.out.println(); System.out.println("*******************************************"); } } }
Membuat objek class untuk Guru99Constructor.class
Mendapatkan semua metadata konstruktor dalam array Constructor
Mencetak semua nama konstruktor yang ada di kelas Guru99Constructor.class
Mencetak semua modifier akses konstruktor di kelas Guru99Constructor.class
Mencetak tipe parameter konstruktor di Guru99Constructor.class
Mencetak exception yang dilemparkan oleh konstruktor di Guru99Constructor.class
Ringkasan:
Pemrograman Reflection di Java membantu dalam mengambil dan memodifikasi informasi tentang kelas dan anggota kelas seperti variabel, metode, konstruktor.
Reflection API di Java dapat diimplementasikan menggunakan kelas di paket java.lang.reflect dan metode dari kelas java.lang.Class.
Beberapa metode umum dari kelas java.lang.Class adalah getName (), getSuperclass (), getInterfaces (), getModifiers () dll.
Beberapa kelas umum di paket java.lang.reflect adalah Field, Method, Constructor, Modifier, dll.
Reflection API dapat mengakses metode dan variabel privat dari sebuah kelas yang bisa menjadi ancaman keamanan.
Reflection API adalah kemampuan canggih yang disediakan oleh Java, tetapi datang dengan beberapa overhead seperti kinerja yang lebih lambat, kerentanan keamanan, dan masalah izin. Oleh karena itu, Reflection API harus diperlakukan sebagai opsi terakhir untuk melakukan operasi.