Apakah Refleksi di Jawa?
Java Reflection adalah proses menganalisis dan mengubah semua kemampuan kelas pada waktu runtime. Refleksi API di Java digunakan untuk memanipulasi kelas dan anggotanya yang merangkumi bidang, kaedah, konstruktor, dan lain-lain pada waktu runtime.
Satu kelebihan API refleksi di Java adalah, ia juga dapat memanipulasi anggota kelas peribadi.
Pakej java.lang.reflect menyediakan banyak kelas untuk melaksanakan refleksi java. Kaedah kelas java.lang.Class digunakan untuk mengumpulkan metadata lengkap kelas tertentu.
Dalam tutorial ini, anda akan belajar-
- Apa itu Refleksi
- Kelas dalam pakej java.lang.reflect
- Kaedah yang digunakan dalam java.lang.Class
- Cara mendapatkan maklumat lengkap mengenai kelas
- Contoh 1: Cara mendapatkan Metadata Kelas
- Contoh 2: Cara mendapatkan Metadata Pembolehubah
- Contoh 3: Cara mendapatkan Metadata Kaedah
- Contoh 4: Cara mendapatkan Metadata Pembina
Kelas dalam pakej java.lang.reflect
Berikut adalah senarai pelbagai kelas Java di java.lang.package untuk melaksanakan refleksi-
- Medan : Kelas ini digunakan untuk mengumpulkan maklumat deklaratif seperti jenis data, pengubah akses, nama dan nilai pemboleh ubah.
- Kaedah : Kelas ini digunakan untuk mengumpulkan maklumat deklaratif seperti pengubah akses, jenis pengembalian, nama, jenis parameter dan jenis pengecualian kaedah.
- Konstruktor : Kelas ini digunakan untuk mengumpulkan maklumat deklaratif seperti pengubah akses, nama dan jenis parameter konstruktor.
- Pengubah : Kelas ini digunakan untuk mengumpulkan maklumat mengenai pengubah akses tertentu.
Kaedah yang digunakan dalam java.lang.Class
- Public String getName () : Mengembalikan nama kelas.
- public Class getSuperclass () : Mengembalikan rujukan kelas super
- Kelas Awam [] getInterfaces () : Mengembalikan pelbagai antara muka yang dilaksanakan oleh kelas yang ditentukan
- Public in getModifiers (): Mengembalikan nilai integer yang mewakili pengubah kelas yang ditentukan yang perlu diteruskan sebagai parameter kepada kaedah " public static String toString (int i)" yang mengembalikan penentu akses untuk kelas yang diberikan.
Cara mendapatkan maklumat lengkap mengenai kelas
Untuk mendapatkan maklumat mengenai pemboleh ubah, kaedah, dan pembina 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, antara muka yang dilaksanakan, dan pengubah akses kelas.
Kami akan mendapat metadata kelas bawah bernama Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Nama kelas adalah: Guru99Base
- Pengubah aksesnya adalah: umum dan abstrak
- Ia telah melaksanakan antara muka: Serializable dan Cloneable
- Oleh kerana ia tidak meluaskan kelas secara eksplisit, kelas supernya ialah: 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));}}
- mencetak nama kelas menggunakan kaedah getName
- Cetak nama kelas super menggunakan kaedah getSuperClass (). GetName ()
- Cetak nama antara muka yang dilaksanakan
- Cetak pengubah akses yang digunakan oleh kelas
Contoh 2: Cara mendapatkan Metadata Pembolehubah
Contoh berikut menunjukkan cara mendapatkan metadata pemboleh ubah:
Di sini, kami membuat kelas bernama Guru99VariableMetaData .class dengan beberapa pemboleh ubah:
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 mengenai pemboleh ubah dalam kelas di atas:
- Buat objek kelas dari kelas di atas iaitu Guru99VariableMetaData.class seperti di bawah:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Dapatkan metadata dalam bentuk array medan menggunakan kaedah getFields () atau getDeclaredFields () seperti di bawah:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
Kaedah getFields () mengembalikan metadata pemboleh ubah awam dari kelas yang ditentukan dan juga dari kelas supernya .
Kaedah getDeclaredFields () mengembalikan metadata semua pemboleh ubah dari kelas yang ditentukan sahaja.
- Dapatkan nama pemboleh ubah menggunakan kaedah "public String getName ()".
- Dapatkan jenis data pemboleh ubah menggunakan kaedah "public Class getType ()".
- Dapatkan nilai pemboleh ubah menggunakan kaedah "public xxx get (Field)".
Di sini, xxx boleh menjadi bait atau kekurangan jenis nilai yang ingin diambil.
- Dapatkan pengubah akses pemboleh ubah menggunakan kaedah getModifier () dan Modifier.toString (int i).
Di sini, kami sedang menulis kelas untuk mendapatkan metadata pemboleh ubah yang terdapat dalam 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Objek kelas dibuat untuk Kelas99VariableMetaData.class
- Mendapat semua metadata pemboleh ubah dalam array Medan
- Mencetak semua nama pemboleh ubah dalam kelas Guru99VariableMetaData.class
- Mencetak semua jenis data pemboleh ubah dalam kelas Guru99VariableMetaData.class
- Mencetak semua pengubah akses pemboleh ubah dalam kelas Guru99VariableMetaData.class
- Nilai dicetak dari semua pemboleh ubah dalam Mencetak semua jenis data pemboleh ubah dalam kelas Guru99VariableMetaData.class
- Buat objek kelas dari kelas di atas iaitu Guru99MethodMetaData.class seperti di bawah:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Dapatkan maklumat kaedah dalam susunan Kaedah menggunakan kaedah getMethods () dan getDeclaredMethods () seperti di bawah:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
Kaedah getMethods () mengembalikan metadata kaedah awam dari kelas yang ditentukan dan juga dari kelas supernya .
Kaedah getDeclaredMethods () mengembalikan metadata semua kaedah dari kelas yang ditentukan sahaja.
- Dapatkan nama kaedah menggunakan kaedah getName () .
- Dapatkan jenis pengembalian kaedah menggunakan kaedah getReturnType () .
- Dapatkan pengubah akses kaedah menggunakan kaedah getModifiers () dan Modifiers.toString (int i) .
- Dapatkan jenis parameter kaedah menggunakan kaedah getParameterTypes () yang mengembalikan array kelas.
- Dapatkan pengecualian dengan menggunakan kaedah getExceptionTypes () yang mengembalikan array kelas.
- Objek kelas dibuat untuk Guru99MethodMetaData.class
- Mendapat semua metadata semua kaedah dalam array Kaedah
- Mencetak semua nama kaedah yang terdapat di kelas Guru99MethodMetaData.class
- Jenis pengembalian dicetak kaedah di kelas Guru99MetodeMetaData.class
- Mencetak semua pengubah akses kaedah dalam kelas Guru99MetodeMetaData.class
- Jenis parameter kaedah yang dicetak dalam kelas Guru99MetodeMetaData.class
- Pengecualian bercetak dilemparkan dengan kaedah dalam kelas Guru99MetodeMetaData.class
- Objek kelas dibuat untuk Guru99Constructor.class
- Mendapat semua metadata semua pembina dalam susunan Konstruktor
- Mencetak semua nama pembangun yang terdapat di kelas Guru99Constructor.class
- Mencetak semua pengubah akses konstruktor dalam kelas Guru99Constructor.class
- Jenis parameter yang dicetak dari konstruktor di Guru99Constructor.class
- Pengecualian bercetak dilemparkan oleh pembina dalam kelas Guru99Constructor.class
- Pengaturcaraan refleksi dalam java membantu dalam mendapatkan dan mengubah maklumat mengenai Kelas dan ahli Kelas seperti pemboleh ubah, kaedah, pembina.
- Refleksi API di Java dapat dilaksanakan dengan menggunakan kelas dalam pakej java.lang.reflect dan kaedah kelas java.lang.Class.
- Beberapa kaedah kelas java.lang.Class yang biasa digunakan ialah getName (), getSuperclass (), getInterfaces (), getModifiers () dll.
- Beberapa kelas yang biasa digunakan dalam pakej java.lang.reflect adalah Field, Method, Constructor, Modifier, dll.
- Refleksi API dapat mengakses kaedah dan pemboleh ubah peribadi kelas yang boleh menjadi ancaman keselamatan.
- Reflection API adalah kemampuan hebat yang disediakan oleh Java, tetapi dilengkapi dengan beberapa overhead seperti prestasi yang lebih perlahan, kerentanan keselamatan, dan masalah izin. Oleh itu, API refleksi harus dianggap sebagai jalan terakhir untuk melakukan operasi.
Contoh 3: Cara mendapatkan Metadata Kaedah
Contoh berikut menunjukkan cara mendapatkan metadata kaedah:
Di sini, kami membuat kelas bernama Guru99MethodMetaData .class dengan beberapa kaedah
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 mengenai kaedah di kelas di atas:
Di sini, kami sedang menulis kelas untuk mendapatkan metadata kaedah yang ada di kelas Guru99MetodeMetaData.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 Pembina
Contoh berikut menunjukkan cara mendapatkan metadata pembina:
Di sini, kami membuat kelas bernama Guru99Constructor.class dengan pembina yang berbeza:
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 sedang menulis kelas untuk mendapatkan metadata pembina yang hadir dalam 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: