Apa itu Refleksi di Jawa?
Java Reflection adalah proses menganalisis dan memodifikasi semua kapabilitas kelas pada saat runtime. API Refleksi di Java digunakan untuk memanipulasi kelas dan anggotanya yang mencakup bidang, metode, konstruktor, dll. Pada waktu proses.
Salah satu keuntungan dari API refleksi di Java adalah dapat memanipulasi anggota privat kelas juga.
Paket java.lang.reflect menyediakan banyak kelas untuk mengimplementasikan refleksi java.Methods dari kelas java.lang.Class digunakan untuk mengumpulkan metadata lengkap dari kelas tertentu.
Dalam tutorial ini, Anda akan belajar-
- Apa itu Refleksi
- Kelas dalam Paket java.lang.reflect
- Metode yang digunakan di java.lang.Class
- Cara mendapatkan informasi lengkap tentang suatu 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 dalam Paket java.lang.reflect
Berikut adalah daftar berbagai kelas Java di java.lang.package untuk mengimplementasikan refleksi-
- Field : Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti tipe data, pengubah akses, nama dan nilai variabel.
- Metode : Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti pengubah akses, tipe kembalian, nama, tipe parameter dan tipe pengecualian dari suatu metode.
- Pembuat : Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti pengubah akses, nama dan jenis parameter konstruktor.
- Pengubah : Kelas ini digunakan untuk mengumpulkan informasi tentang pengubah akses tertentu.
Metode yang digunakan di java.lang.Class
- Public String getName () : Mengembalikan nama kelas.
- public Class getSuperclass () : Mengembalikan referensi kelas super
- Kelas Publik [] getInterfaces () : Mengembalikan larik antarmuka yang diimplementasikan oleh kelas yang ditentukan
- Public in getModifiers (): Mengembalikan nilai integer yang mewakili pengubah kelas tertentu yang perlu diteruskan sebagai parameter ke metode " public static String toString (int i)" yang mengembalikan penentu akses untuk kelas yang diberikan.
Cara mendapatkan informasi lengkap tentang suatu kelas
Untuk mendapatkan informasi tentang variabel, metode, dan konstruktor kelas, kita perlu membuat objek kelas.public class Guru99ClassObjectCreation {public static void main (String[] args) throws ClassNotFoundException {//1 - By using Class.forname() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
Contoh 1: Cara mendapatkan Metadata Kelas
Contoh berikut menunjukkan cara mendapatkan metadata seperti: Nama kelas, nama kelas super, antarmuka yang diimplementasikan, dan pengubah akses kelas.
Kami akan mendapatkan metadata dari kelas di bawah ini bernama Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Nama kelasnya adalah: Guru99Base
- Pengubah aksesnya adalah: publik dan abstrak
- Ini telah mengimplementasikan antarmuka: Serializable dan Cloneable
- Karena tidak ada kelas yang diperluas secara eksplisit, kelas supernya adalah: java.lang.Object
import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClassguru99ClassObj = Guru99Base.class;// Print name of the classsystem.out.println("Name of the class is : " +guru99ClassObj.getName());// Print Super class namesystem.out.println("Name of the super class is : " +guru99ClassObj.getSuperclass().getName());// Get the list of implemented interfaces in the form of Class array using getInterface() methodclass[] guru99InterfaceList = guru99classObj.getInterfaces();// Print the implemented interfaces using foreach loopsystem.out.print("Implemented interfaces are : ");for (Class guru99class1 : quru99 InterfaceList) {system.out.print guru99class1.getName() + " ");}system.out.println();//Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier classint guru99AccessModifier= guru99classObj.getModifiers();// Print the access modifiersSystem.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));}}
- cetak nama kelas menggunakan metode getName
- Cetak nama kelas super menggunakan metode getSuperClass (). GetName ()
- Cetak nama antarmuka yang diimplementasikan
- Cetak pengubah akses yang digunakan oleh kelas
Contoh 2: Cara mendapatkan Metadata Variabel
Contoh berikut menunjukkan cara mendapatkan metadata variabel:
Di sini, kami 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 kelas dari kelas di atas yaitu Guru99VariableMetaData.class seperti di bawah ini:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Dapatkan metadata dalam bentuk field array menggunakan metode getFields () atau getDeclaredFields () seperti di bawah ini:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
Metode getFields () mengembalikan metadata dari variabel publik dari kelas yang ditentukan serta dari kelas supernya.
Metode getDeclaredFields () mengembalikan metadata dari semua variabel hanya dari kelas yang ditentukan.
- Dapatkan nama variabel menggunakan metode "public String getName ()".
- Dapatkan tipe data variabel menggunakan metode "kelas publik getType ()".
- Dapatkan nilai variabel menggunakan metode "public xxx get (Field)".
Di sini, xxx bisa berupa byte atau pendek dari semua jenis nilai yang ingin kita ambil.
- Dapatkan pengubah akses variabel menggunakan metode getModifier () dan Modifier.toString (int i).
Di sini, kami menulis kelas untuk mendapatkan metadata dari 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 {// Create Class object for Guru99VariableMetaData.classGuru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();// Get the metadata of all the fields of the class Guru99VariableMetaDataField[] guru99Field1= guru99ClassObjVar.getDeclaredFields();// Print name, datatypes, access modifiers and values of the varibales of the specified classfor(Field field : guru99Field1) {System.out.println("Variable name : "+field.getName());System.out.println("Datatypes of the variable :"+field.getType());int guru99AccessModifiers = field.getModifiers();System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers));System.out.println("Value of the variable : "+field.get(guru99ClassVar));System.out.println();system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Membuat objek kelas untuk Guru99VariableMetaData.class
- Dapatkan semua metadata variabel dalam array Bidang
- Mencetak semua nama variabel di kelas Guru99VariableMetaData.class
- Mencetak semua tipe data variabel di kelas Guru99VariableMetaData.class
- Mencetak semua pengubah akses variabel di kelas Guru99VariableMetaData.class
- Nilai yang dicetak dari semua variabel di Cetak semua tipe data variabel di kelas Guru99VariableMetaData.class
- Buat objek kelas dari kelas di atas yaitu Guru99MethodMetaData.class seperti di bawah ini:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Dapatkan informasi metode dalam array Metode menggunakan metode getMethods () dan getDeclaredMethods () seperti di bawah ini:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
Metode getMethods () mengembalikan metadata metode publik dari kelas yang ditentukan serta dari kelas supernya.
Metode getDeclaredMethods () mengembalikan metadata dari semua metode hanya dari kelas yang ditentukan.
- Dapatkan nama metode menggunakan metode getName () .
- Dapatkan tipe pengembalian metode menggunakan metode getReturnType () .
- Dapatkan pengubah akses metode menggunakan metode getModifiers () dan Modifiers.toString (int i) .
- Dapatkan tipe parameter metode menggunakan metode getParameterTypes () yang mengembalikan larik kelas.
- Dapatkan pengecualian dilempar menggunakan metode getExceptionTypes () yang mengembalikan larik kelas.
- Membuat objek kelas untuk Guru99MethodMetaData.class
- Dapatkan semua metadata dari semua metode dalam array Metode
- Mencetak semua nama metode yang ada di kelas Guru99MethodMetaData.class
- Jenis metode pengembalian yang dicetak di kelas Guru99MethodMetaData.class
- Mencetak semua pengubah akses metode di kelas Guru99MethodMetaData.class
- Jenis parameter yang dicetak dari metode di Guru99MethodMetaData.class
- Pengecualian tercetak diberikan oleh metode di Guru99MethodMetaData.class
- Membuat objek kelas untuk Guru99Constructor.class
- Dapatkan semua metadata dari semua konstruktor dalam larik Pembuat
- Mencetak semua nama konstruktor yang ada di kelas Guru99Constructor.class
- Mencetak semua pengubah akses konstruktor di kelas Guru99Constructor.class
- Jenis parameter yang dicetak dari konstruktor di Guru99Constructor.class
- Pengecualian tercetak diberikan oleh konstruktor di Guru99Constructor.class
- Pemrograman refleksi di java membantu dalam mengambil dan memodifikasi informasi tentang Kelas dan anggota Kelas variabel, metode, konstruktor.
- API Refleksi di Java dapat diimplementasikan menggunakan kelas-kelas dalam paket java.lang.reflect dan metode kelas java.lang.Class.
- Beberapa metode yang umum digunakan dari kelas java.lang.Class adalah getName (), getSuperclass (), getInterfaces (), getModifiers () dll.
- Beberapa kelas yang umum digunakan dalam paket java.lang.reflect adalah Bidang, Metode, Pembuat, Pengubah, dll.
- API Refleksi dapat mengakses metode dan variabel privat dari suatu kelas yang dapat menjadi ancaman keamanan.
- Reflection API adalah kapabilitas andal yang disediakan oleh Java, tetapi dilengkapi dengan beberapa overhead seperti kinerja yang lebih lambat, kerentanan keamanan, dan masalah izin. Oleh karena itu, API refleksi harus diperlakukan sebagai pilihan terakhir untuk melakukan operasi.
Contoh 3: Cara mendapatkan Metadata Metode
Contoh berikut menunjukkan cara mendapatkan metadata dari suatu metode:
Di sini, kami 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 for Reflextion API");}public String guru99Search(String searchString)throws ArithmeticException, InterruptedException{System.out.println("Demo method for Reflection API");return null;}public void guru99Delete(String deleteString)throws SQLException{System.out.println("Demo method for Reflection API");}}
Langkah-langkah untuk mendapatkan metadata tentang metode di kelas di atas:
Di sini, kami menulis kelas untuk mendapatkan metadata dari 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) {// Create Class object for Guru99Method MetaData.classclass guru99ClassObj = Guru99MethodMetaData.class;// Get the metadata or information of all the methods of the class using getDeclaredMethods()Method[] guru99Methods=guru99classObj.getDeclaredMethods();for(Method method : guru99Methods) {// Print the method namesSystem.out.println("Name of the method : "+method.getName());// Print return type of the methodsSystem.out.println("Return type of the method : "+method.getReturnType());//Get the access modifier list and printint guru99ModifierList = method.getModifiers();System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));// Get and print parameters of the methodsClass[] guru99ParamList= method.getParameterTypes();system.out.print ("Method parameter types : ");for (Class class1 : guru99ParamList){System.out.println(class1.getName()+" ");}System.out.println();// Get and print exception thrown by the methodClass[] guru99ExceptionList = method. getExceptionTypes();system.out.print("Excpetion thrown by method :");for (Class class1 : guru99ExceptionList) {System.out.println (class1.getName() +" "):}System.Out.println();system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Contoh 4: Cara mendapatkan Metadata Konstruktor
Contoh berikut menunjukkan cara mendapatkan metadata dari konstruktor:
Di sini, kami membuat kelas bernama Guru99Constructor.class dengan konstruktor berbeda:
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, kami menulis kelas untuk mendapatkan metadata dari konstruktor yang ada di kelas Guru99Constructor.class:
package guru;import java.lang.reflect.Constructor;public class Guru99ConstructorMetaDataTest {public static void main (String[] args) {// Create Class object for Guru99Constructor.classClass guru99Class=Guru99Constructor.class;// Get all the constructor information in the Constructor arrayConstructor[] guru99ConstructorList = guru99Class.getConstructors();for (Constructor constructor : guru99ConstructorList) {// Print all name of each constructorSystem.out.println("Constrcutor name : "+constructor.getName());//Get and print access modifiers of each constructorint guru99Modifiers= constructor.getModifiers();System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));// Get and print parameter typesClass[] guru99ParamList=constructor.getParameterTypes();System.out.print ("Constrctor parameter types :");for (Class class1 : guru99ParamList) {System.out.println(class1.getName() +" ");}System. out.println();// Get and print exception thrown by constructorsClass[] guru99ExceptionList=constructor.getFxceptionTypes();System.out.println("Exception thrown by constructors :");for (Class class1 : guru99ExceptionList) {System.out.println(class1.getName() +" ");}System.out.println();System.out.println("*******************************************");}}}
Ringkasan: