Java Tutorial API Refleksi dengan Contoh

⚡ Ringkasan Cerdas

Java API Refleksi menganalisis dan memodifikasi kemampuan suatu kelas saat runtime, termasuk field, method, dan constructor-nya. Sumber daya ini menjelaskan paket java.lang.reflect, metode-metode utama dari java.lang.Class, dan empat contoh yang membaca metadata dari suatu kelas, variabel, method, dan constructor.

  • 🔍 Definisi: Reflection memeriksa dan mengubah kelas dan anggotanya saat runtime, bahkan yang bersifat privat.
  • 📦 Paket Refleksi: Kelas Field, Method, Constructor, dan Modifier mengumpulkan informasi deklaratif tentang anggotanya.
  • ️ Metode Kelas: getName(), getSuperclass(), getInterfaces(), dan getModifiers() mengembalikan metadata kelas inti.
  • 🧪 Contoh Soal: Empat program extracmetadata dari sebuah kelas, variabel, metode, dan konstruktor.
  • ⚠️ Peringatan: Reflection dapat mengakses anggota pribadi dan lebih lambat, jadi gunakan sebagai pilihan terakhir.

Java Tutorial API Refleksi

Apa yang dimaksud dengan Refleksi Java?

Java Refleksi adalah proses menganalisis dan memodifikasi semua kemampuan suatu kelas saat runtime. API Refleksi di Java Digunakan untuk memanipulasi sebuah kelas dan anggotanya, yang meliputi field, method, constructor, dll., pada saat runtime.

Salah satu keunggulan API Refleksi adalah Java yaitu, ia juga dapat memanipulasi anggota privat dari kelas tersebut.

Paket java.lang.reflect menyediakan banyak kelas untuk mengimplementasikan refleksi. Metode-metode dari 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 dalam paket java.lang.reflect 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 dari suatu metode.
  • Pembina: Kelas ini digunakan untuk mengumpulkan informasi deklaratif seperti pengubah akses, nama, dan tipe parameter dari sebuah konstruktor.
  • Pengubah: Kelas ini digunakan untuk mengumpulkan informasi tentang pengubah akses tertentu.

Metode yang digunakan di java.lang.Class

  • String publik getName(): Mengembalikan nama kelas.
  • Kelas publik getSuperclass(): Mengembalikan referensi kelas induk.
  • public Class[] getInterfaces(): Mengembalikan array antarmuka yang diimplementasikan oleh kelas yang ditentukan.
  • publik int getModifiers(): Mengembalikan nilai integer yang mewakili pengubah (modifier) ​​dari kelas yang ditentukan, yang perlu diteruskan sebagai parameter ke metode “public static String toString(int i)” yang mengembalikan penentu akses (access specifier) ​​untuk kelas yang diberikan.

Cara mendapatkan informasi lengkap tentang suatu kelas

Untuk mendapatkan informasi tentang variabelUntuk mengakses metode dan konstruktor suatu kelas, kita perlu membuat objek dari kelas tersebut. Contoh berikut menunjukkan berbagai cara untuk membuat objek dari kelas “Class”:

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 1: Cara mendapatkan Metadata Kelas

Contoh berikut menunjukkan cara mendapatkan metadata seperti nama kelas, nama kelas induk, antarmuka yang diimplementasikan, dan pengubah akses dari 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 tidak mewarisi kelas apa pun secara eksplisit, kelas induknya 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<Guru99Base> 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 using getInterfaces() method
        Class[] guru99InterfaceList = guru99ClassObj.getInterfaces();

        // Print the implemented interfaces using a for-each loop
        System.out.print("Implemented interfaces are : ");
        for (Class guru99class1 : guru99InterfaceList) {
            System.out.print(guru99class1.getName() + " ");
        }
        System.out.println();

        // Get access modifiers using getModifiers() and Modifier.toString()
        int guru99AccessModifier = guru99ClassObj.getModifiers();
        System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier));
    }
}
  1. Cetak nama kelas menggunakan metode getName().
  2. Cetak nama kelas induk menggunakan metode getSuperclass().getName().
  3. Cetak nama-nama antarmuka yang telah diimplementasikan.
  4. Cetak pengubah akses yang digunakan oleh kelas tersebut.

Dapatkan Metadata Kelas

Dapatkan Metadata Kelas

Contoh 2: Cara mendapatkan Metadata Variabel

Contoh berikut menunjukkan cara mendapatkan metadata dari sebuah 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 Field menggunakan dapatkan Bidang() or dapatkanDeclaredFields() metode seperti di bawah ini:
    Field[] guru99Field1 = guru99ClassObjVar.getFields();
    Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();

The dapatkan Bidang() Metode ini mengembalikan metadata variabel publik dari kelas yang ditentukan serta dari kelas induknya.

The dapatkanDeclaredFields() Metode ini hanya mengembalikan metadata dari semua variabel dari kelas yang ditentukan.

  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 byte, short, atau tipe nilai apa pun yang ingin kita ambil.
  4. Dapatkan pengubah akses variabel menggunakan metode getModifiers() 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;
import java.lang.reflect.Modifier;

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
        Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields();

        // Print name, data types, access modifiers and values of the variables
        for (Field field : guru99Field1) {
            System.out.println("Variable name : " + field.getName());
            System.out.println("Datatype of the variable : " + field.getType());

            int guru99AccessModifiers = field.getModifiers();
            System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers));
            System.out.println("Value of the variable : " + field.get(guru99ClassVar));
            System.out.println();
        }
    }
}
  1. Membuat objek kelas untuk Guru99VariableMetaData.class.
  2. Semua metadata variabel telah diperoleh dalam sebuah array Field.
  3. Mencetak semua nama variabel dalam kelas. Guru99VariableMetaData.class.
  4. Mencetak semua tipe data variabel dalam kelas tersebut.
  5. Mencetak semua pengubah akses variabel dalam kelas tersebut.
  6. Mencetak nilai semua variabel dalam kelas.

Dapatkan Metadata Metode

Dapatkan Metadata Metode

Contoh 3: Cara mendapatkan Metadata Metode

Contoh berikut menunjukkan cara mendapatkan metadata dari sebuah 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 Reflection 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-metode dalam 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[] guru99Method1 = guru99ClassObjVar.getMethods();
    Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();

    The dapatkanMetode() Metode ini mengembalikan metadata dari metode publik dari kelas yang ditentukan serta dari kelas induknya. dapatkan Metode Deklarasi() Metode ini hanya mengembalikan metadata dari semua metode yang terdapat dalam kelas yang ditentukan.

  3. Dapatkan nama metode menggunakan getName () Metode.
  4. Dapatkan tipe kembalian dari metode tersebut menggunakan dapatkanReturnType() Metode.
  5. Dapatkan pengubah akses dari metode menggunakan getModifier() ke Pengubah.toString(int i) metode.
  6. Dapatkan tipe parameter metode menggunakan dapatkanParameterTypes() metode, yang mengembalikan array Kelas.
  7. Dapatkan pengecualian yang dilemparkan 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 Guru99MethodMetaData.class
        Class guru99ClassObj = Guru99MethodMetaData.class;

        // Get the metadata of all the methods using getDeclaredMethods()
        Method[] guru99Methods = guru99ClassObj.getDeclaredMethods();

        for (Method method : guru99Methods) {
            System.out.println("Name of the method : " + method.getName());
            System.out.println("Return type of the method : " + method.getReturnType());

            int guru99ModifierList = method.getModifiers();
            System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList));

            Class[] guru99ParamList = method.getParameterTypes();
            System.out.print("Method parameter types : ");
            for (Class class1 : guru99ParamList) {
                System.out.print(class1.getName() + " ");
            }
            System.out.println();

            Class[] guru99ExceptionList = method.getExceptionTypes();
            System.out.print("Exception thrown by method : ");
            for (Class class1 : guru99ExceptionList) {
                System.out.print(class1.getName() + " ");
            }
            System.out.println();
        }
    }
}
  1. Membuat objek kelas untuk Guru99MethodMetaData.class.
  2. Mendapatkan semua metadata dari semua metode dalam array Metode.
  3. Mencetak semua nama metode yang ada di dalam kelas.
  4. Mencetak tipe nilai kembalian dari metode-metode dalam kelas tersebut.
  5. Mencetak semua pengubah akses dari metode-metode dalam kelas tersebut.
  6. Mencetak tipe parameter dari metode-metode tersebut.
  7. Mencetak pengecualian yang dilemparkan oleh metode-metode tersebut.

Dapatkan Metadata Metode

Dapatkan Metadata Metode

Contoh 4: Cara mendapatkan Metadata Konstruktor

Contoh berikut menunjukkan cara mendapatkan metadata dari 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;
import java.lang.reflect.Modifier;
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) {
            System.out.println("Constructor name : " + constructor.getName());

            int guru99Modifiers = constructor.getModifiers();
            System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers));

            Class[] guru99ParamList = constructor.getParameterTypes();
            System.out.print("Constructor parameter types : ");
            for (Class class1 : guru99ParamList) {
                System.out.print(class1.getName() + " ");
            }
            System.out.println();

            Class[] guru99ExceptionList = constructor.getExceptionTypes();
            System.out.print("Exception thrown by constructors : ");
            for (Class class1 : guru99ExceptionList) {
                System.out.print(class1.getName() + " ");
            }
            System.out.println();
        }
    }
}
  1. Membuat objek kelas untuk Guru99Constructor.class.
  2. Mendapatkan semua metadata dari semua konstruktor dalam sebuah array Konstruktor.
  3. Mencetak semua nama konstruktor yang ada di dalam kelas.
  4. Mencetak semua pengubah akses dari konstruktor dalam kelas tersebut.
  5. Mencetak tipe parameter dari konstruktor.
  6. Mencetak pengecualian yang dilemparkan oleh konstruktor.

Dapatkan Metadata Konstruktor

Dapatkan Metadata Konstruktor

Pertanyaan Umum Demo Slot

Refleksi memungkinkan kerangka kerja dan alat AI untuk memeriksa dan membuat instance kelas saat runtime. Ini mendukung injeksi dependensi, serialisasi, dan pemetaan ORM.ping, dan pemuatan plugin dinamis tanpa mengetahui kelas pastinya pada saat kompilasi.

AI dapat membuat kerangka kode refleksi dengan cepat, tetapi Anda harus meninjaunya dengan cermat. Refleksi dapat melewati pemeriksaan akses dan menimbulkan risiko keamanan dan kinerja, sehingga kode yang dihasilkan perlu diuji dan divalidasi.

Refleksi lebih lambat daripada pemanggilan metode langsung, dapat melanggar enkapsulasi dengan mengakses anggota privat, dan dapat menyebabkan masalah keamanan dan pemeliharaan. Refleksi sebaiknya hanya digunakan jika tidak ada pendekatan yang lebih sederhana.

Ya. Dengan menggunakan setAccessible(true), refleksi dapat membaca dan memodifikasi field privat serta memanggil metode privat. Ini sangat berguna untuk pengujian dan framework, tetapi dapat melanggar enkapsulasi dan menimbulkan masalah keamanan.

Ringkaslah postingan ini dengan: