Java Tutorial API Refleksi dengan Contoh

Apa yang dimaksud dengan Refleksi Java?

Java Refleksi adalah proses menganalisis dan memodifikasi semua kemampuan kelas saat runtime. API Refleksi di Java digunakan untuk memanipulasi kelas dan anggotanya yang mencakup bidang, metode, konstruktor, dll. saat runtime.

Salah satu keuntungan dari API refleksi di Java yaitu, ia dapat memanipulasi anggota pribadi kelas juga.

Paket java.lang.reflect menyediakan banyak kelas untuk mengimplementasikan refleksi java. Metode kelas java.lang.Class digunakan untuk mengumpulkan metadata lengkap dari kelas tertentu.

Kelas dalam Paket java.lang.reflect

Berikut ini adalah daftar berbagai Java kelas-kelas di java.lang.package untuk mengimplementasikan refleksi-

  • Bidang: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti tipe data, pengubah akses, nama dan nilai suatu variabel.
  • metode: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti pengubah akses, tipe pengembalian, nama, tipe parameter, dan tipe pengecualian suatu metode.
  • Pembina: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti pengubah akses, nama dan tipe parameter konstruktor.
  • Mengubah: Kelas ini digunakan untuk mengumpulkan informasi tentang pengubah akses tertentu.

Metode yang digunakan di java.lang.Class

  • GetName String Publik (): Mengembalikan nama kelas.
  • Kelas publik getSuperclass(): Mengembalikan referensi kelas super
  • Kelas Publik[] getInterfaces() : Mengembalikan array antarmuka yang diimplementasikan oleh kelas tertentu
  • Publik di getModifiers(): Mengembalikan nilai integer yang mewakili pengubah kelas tertentu yang perlu diteruskan sebagai parameter ke โ€œString statis publik toString (int i )โ€ metode yang mengembalikan penentu akses untuk kelas tertentu.

Cara mendapatkan informasi lengkap tentang suatu kelas

Untuk mendapatkan informasi tentang variabel, metode, dan konstruktor suatu kelas, kita perlu membuat objek kelas tersebut.

Metode yang digunakan di java.lang.Class

public class Guru99ClassObjectCreation {
	public static void main (String[] args) throws ClassNotFoundException {
		//1 - By using Class.forname() method 
		Class c1 = Class.forName("Guru99ClassObjectCreation"); 
		//2- By using getClass() method 
		Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();
		Class c2 = guru99Obj.getClass();
		//3- By using .class 
		Class c3= Guru99ClassObjectCreation.class;
		}
	}
  • Contoh berikut menunjukkan berbagai cara untuk membuat objek kelas โ€œ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 suatu kelas.

    Kita akan mendapatkan metadata dari kelas di bawah ini yang bernama Guru99Base.class:

    Dapatkan Metadata Kelas

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Nama kelasnya adalah: Guru99 Basis
    2. Pengubah aksesnya adalah: public dan abs.tract
    3. Ini telah mengimplementasikan antarmuka: Serializable dan Cloneable
    4. Karena belum memperluas kelas apa pun secara eksplisit, kelas supernya adalah: java.lang.Object

    Kelas di bawah ini akan mendapatkan metadata dari Guru99Base.class dan cetaklah:

    Dapatkan Metadata Kelas

    import java.lang.reflect.Modifier;
    public class Guru99GetclassMetaData {
    
    	public static void main (String [] args) throws ClassNotFoundException { 
    	// Create Class object for Guru99Base.class 
    	Class guru99ClassObj = Guru99Base.class;
    	
    	// Print name of the class 
    	system.out.println("Name of the class is : " +guru99ClassObj.getName());
    	
    	// Print Super class name
    	system.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() method
    	class[] guru99InterfaceList = guru99classObj.getInterfaces();
    	
    	// Print the implemented interfaces using foreach loop 
    	system.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 class
    	int guru99AccessModifier= guru99classObj.getModifiers(); 
    	// Print the access modifiers
    	System.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));
    	
    	}
    }
    
    1. cetak nama kelas menggunakan metode getName
    2. Cetak nama kelas super menggunakan metode getSuperClass().getName()
    3. Cetak nama antarmuka yang diimplementasikan
    4. Cetak pengubah akses yang digunakan oleh kelas

    Dapatkan Metadata Kelas

    Dapatkan Metadata Kelas

    Contoh 2 : Cara mendapatkan Metadata Variabel

    Contoh berikut menunjukkan cara mendapatkan metadata variabel:

    Di sini, kita membuat sebuah 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 pada kelas di atas:
    1. Buat objek kelas dari kelas di atas, yaitu Guru99VariableMetaData.class seperti di bawah ini:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Dapatkan metadata dalam bentuk array bidang menggunakan dapatkan Bidang() or dapatkanDeclaredFields() metode seperti di bawah ini:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    dapatkan Bidang() metode mengembalikan metadata variabel publik dari kelas tertentu serta dari kelas supernya.

    dapatkanDeclaredFields() metode mengembalikan metadata semua variabel dari kelas tertentu saja.

    1. Dapatkan nama variabel menggunakan metode โ€œpublic String getName()โ€.
    2. Dapatkan tipe data variabel menggunakan metode โ€œpublic Class getType()โ€.
    3. Dapatkan nilai variabel menggunakan metode โ€œpublic xxx get (Field)โ€.

      Di sini, xxx bisa berupa satu byte atau lebih pendek dari jenis nilai apa pun yang ingin kita ambil.

    4. Dapatkan pengubah akses variabel menggunakan metode getModifier() dan Modifier.toString(int i).

      Di sini, kita menulis sebuah kelas untuk mendapatkan metadata dari variabel-variabel yang ada di dalam kelas tersebut. Guru99VariableMetaData.class:

      Dapatkan Metadata Variabel

      package guru;
      import java.lang.reflect.Field; 
      
      public class Guru99VariableMetaDataTest {
      	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { 
      	// Create Class object for Guru99VariableMetaData.class 
      	Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); 
      	Class guru99ClassObjVar = guru99ClassVar.getClass();
      	
      	// Get the metadata of all the fields of the class Guru99VariableMetaData 
      	Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields();
      	
      	// Print name, datatypes, access modifiers and values of the varibales of the specified class 
      	for(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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;
      	}
      	}
      }
      
      1. Objek kelas dibuat untuk Guru99VariableMetaData.class
      2. Mendapat semua metadata variabel dalam array Bidang
      3. Mencetak semua nama variabel dalam kelas. Guru99VariableMetaData.class
      4. Mencetak semua tipe data variabel dalam kelas. Guru99VariableMetaData.class
      5. Mencetak semua pengubah akses variabel dalam kelas tersebut. Guru99VariableMetaData.class
      6. Mencetak nilai semua variabel di dalam kelas. Mencetak semua tipe data variabel di dalam kelas. Guru99VariableMetaData.class

      Dapatkan Metadata Metode

      Dapatkan Metadata Metode

      Contoh 3 : Cara mendapatkan Metadata Metode

      Contoh berikut menunjukkan cara mendapatkan metadata suatu metode:

      Di sini, kita membuat sebuah kelas bernama Guru99MethodMetaData .class dengan beberapa metode

      Dapatkan Metadata 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 :

      1. Buat objek kelas dari kelas di atas, yaitu Guru99MethodMetaData.class seperti di bawah ini:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. 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();

        dapatkanMetode() metode mengembalikan metadata metode publik dari kelas tertentu serta dari kelas supernya.

        dapatkan Metode Deklarasi() metode mengembalikan metadata semua metode dari kelas tertentu saja.

      3. Dapatkan nama metode yang digunakan getName () Metode.
      4. Dapatkan tipe kembalian dari metode yang digunakan dapatkanReturnType() Metode.
      5. Dapatkan pengubah akses dari metode yang digunakan getModifier() ke Pengubah.toString(int i) metode.
      6. Dapatkan tipe parameter metode menggunakan dapatkanParameterTypes() metode yang mengembalikan array kelas.
      7. Dapatkan pengecualian menggunakan getExceptionType() metode yang mengembalikan array kelas.

      Di sini, kita menulis sebuah kelas untuk mendapatkan metadata dari metode-metode yang ada di dalam kelas tersebut. Guru99MethodMetaData.class:

      Dapatkan Metadata Metode

      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.class 
      		class 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 names
      		System.out.println("Name of the method : "+method.getName());
      		
      		// Print return type of the methods 
      		System.out.println("Return type of the method : "+method.getReturnType());
      		
      		//Get the access modifier list and print
      		int guru99ModifierList = method.getModifiers(); 
      		System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
      		
      		// Get and print parameters of the methods 
      		Class[] 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 method 
      		Class[] 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
      		
      		}
       
      	}
      }
      
      1. Objek kelas dibuat untuk Guru99MethodMetaData.class
      2. Mendapat semua metadata dari semua metode dalam array Metode
      3. Mencetak semua nama metode yang ada di dalam kelas. Guru99MethodMetaData.class
      4. Tipe pengembalian tercetak dari metode-metode dalam kelas tersebut. Guru99MethodMetaData.class
      5. Mencetak semua pengubah akses dari metode-metode dalam kelas tersebut. Guru99MethodMetaData.class
      6. Tipe parameter tercetak dari metode-metode tersebut Guru99MethodMetaData.class
      7. Pengecualian yang dicetak dilemparkan oleh metode-metode di Guru99MethodMetaData.class

        Dapatkan Metadata Metode

      Dapatkan Metadata Metode

      Contoh 4 : Cara mendapatkan Metadata Konstruktor

      Contoh berikut menunjukkan cara mendapatkan metadata konstruktor:

      Di sini, kita membuat sebuah kelas bernama Guru99Constructor.class dengan konstruktor yang berbeda:

       Dapatkan Metadata 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 sebuah kelas untuk mendapatkan metadata dari konstruktor yang ada di dalam kelas tersebut. Guru99Constructor.class:

      Dapatkan Metadata Konstruktor

      package guru;
      import java.lang.reflect.Constructor; 
      public class Guru99ConstructorMetaDataTest {
      	
      	public static void main (String[] args) {
      		// Create Class object for Guru99Constructor.class 
      		Class guru99Class=Guru99Constructor.class;
      
      		// Get all the constructor information in the Constructor array
      		Constructor[] guru99ConstructorList = guru99Class.getConstructors();
      		
      		for (Constructor constructor : guru99ConstructorList) {
      			// Print all name of each constructor
      			System.out.println("Constrcutor name : "+constructor.getName());
      			
      			//Get and print access modifiers of each constructor 
      			int guru99Modifiers= constructor.getModifiers(); 
      			System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
      			
      			// Get and print parameter types 
      			Class[] 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 constructors
      			Class[] 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("*******************************************");
      		}
      	}
      }
      
      1. Objek kelas dibuat untuk Guru99Konstruktor.kelas
      2. Mendapat semua metadata dari semua konstruktor dalam array Konstruktor
      3. Mencetak semua nama konstruktor yang ada di dalam kelas. Guru99Konstruktor.kelas
      4. Mencetak semua pengubah akses dari konstruktor dalam kelas tersebut. Guru99Konstruktor.kelas
      5. Tipe parameter tercetak dari konstruktor di Guru99Konstruktor.kelas
      6. Pengecualian yang dicetak dilemparkan oleh konstruktor di Guru99Konstruktor.kelas

      Dapatkan Metadata Konstruktor

      Dapatkan Metadata Konstruktor

      Ringkasan

      • Pemrograman refleksi di java membantu mengambil dan mengubah informasi tentang Kelas dan anggota Kelas seperti variabel, metode, konstruktor.
      • API Refleksi di Java dapat diimplementasikan menggunakan kelas dalam paket java.lang.reflect dan metode kelas java.lang.Class.
      • Beberapa metode kelas java.lang.Class yang umum digunakan adalah getName(), getSuperclass(), getInterfaces(), getModifiers() dll.
      • Beberapa kelas yang umum digunakan dalam paket java.lang.reflect adalah Field, Method, Constructor, Modifier, dll.
      • Reflection API dapat mengakses metode pribadi dan variabel suatu kelas yang dapat menjadi ancaman keamanan.
      • Reflection API adalah kemampuan canggih yang disediakan oleh Java, tetapi disertai dengan beberapa kendala seperti kinerja yang lebih lambat, kerentanan keamanan, dan masalah izin. Oleh karena itu, API refleksi harus diperlakukan sebagai pilihan terakhir untuk melakukan suatu operasi.

    Ringkaslah postingan ini dengan: