Akses Property Menggunakan Java Reflection

Jumpa lagi dengan saya yang kali ini akan membawakan tema tulisan tentang Java Reflection. Java Reflection secara umum digunakan dalam program untuk memodifikasi prilaku saat runtime dari suatu aplikasi yang berjalan di Java Virtual Machine. Java Reflection ini berguna misal jika ingin membuat framework sendiri (dari googling), atau membuat annotation sendiri (pengalam pribadi) dan mungkin untuk keperluan lainnya. Dalam tulisan kali ini saya akan mencoba membahas mengenai akses property (field) suatu kelas dengan menggunakan Java Reflection.

Dalam kegiatan kali ini saya tidak akan banyak panjang lebar dalam menjelaskannya namun akan saya gambarkan dalam bentuk praktikum berupa source code. Pada kegiatan ini, yang akan dibahas adalah mengakses field kelas anak dan kelas induk (super class) dengan menggunakan java reflection. Untuk itu kegiatan kali ini dibagi menjadi tahap-tahap berikut:

1. Membuat Kelas Induk (super class) dan Kelas Anak
Pada tahap pertama ini kita harus membuat dua kelas yaitu KelasInduk dan KelasAnak. Adapun potongan source code-nya dapat dilihat pada gambar berikut:
KelasInduk.java

/**
 *
 * @author hape
 */
public class KelasInduk {
    public String variabelIndukPublic = "nilai-induk-public";
    private String variabelIndukPrivate = "nilai-induk-private";
    protected String variabelIndukProtected = "nilai-induk-protected";
}

Setelah KelasInduk.java dibuat maka langkah selanjutnya adalah membuat KelasAnak.java yang dapat dilihat pada gambar dibawah.
KelasAnak.java

/**
 *
 * @author hape
 */
public class KelasAnak extends KelasInduk{
    private String variabelAnakPrivate = "value anak Private";
    public String variabelAnakPublic = "value anak Public";
    protected String variabelAnakProtected = "value anak Protected";
}

2. Mengakses Field Pada Kelas Anak
Setelah kelas yang dibutuhkan selesai dibuat maka berikutnya adalah kegiatan untuk mengakses field-field yang terdapat di kelas anak. Untuk proses mengakses ini saya gabungkan dalam suatu method dan untuk lebih jelasnya dapat dilihat pada potongan source code dibawah ini:

    public void getPropertyAnak(Object obj) {
        try {
            Class clazz = obj.getClass();
            for (Field field : clazz.getDeclaredFields()) {
                boolean isAccessible = field.isAccessible();                
                System.out.println("Nama Variabel: " + field.getName());
                System.out.println("Accessible   : " + isAccessible);
                System.out.println("Modifier     : " + this.getNilaiModifier(field.getModifiers()));
                System.out.println("N i l a i    : " + this.getValue(field, obj, isAccessible) + "\n");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

Dari potongan source code diatas, method getNilaiModifier adalah untuk mendapatkan modifier pada field yang akan diakses (public, protected atau private). Untuk lebih jelasnya silahkan dilihat pada potongan source code berikut:

    // untuk mengecek modifier dari properties
    private String getNilaiModifier(int mod) {
        if (Modifier.isPrivate(mod)) {
            return "private";
        } else if (Modifier.isProtected(mod)) {
            return "protected";
        } else if (Modifier.isPublic(mod)) {
            return "public";
        }
        return "others";
    }

Selain method getNilaiModifier ada juga method getValue yang saya gunakan untuk mendapatkan nilai dari property yang akan diakses. Adapun contoh codingnya bisa dilihat pada potongan source code berikut:

    // mengambil nilai object
    private Object getValue(Field field, Object obj, boolean isAccessible){
        Object valueObject = null;
        try {
          if (!isAccessible){
              field.setAccessible(true);
              valueObject = field.get(obj);
              field.setAccessible(false);
          }else{
            valueObject = field.get(obj);
          }                      
        } catch (Exception ex) {
            ex.printStackTrace();
            valueObject = null;
        }        
        return valueObject;
    }

3. Mengakses Field Pada Kelas Induk
Pada langkah ketiga ini pada prinsipnya hampir sama dengan langkah-langkah yang dilakukan pada langkah nomor 2. Namun, agar bisa lebih mudah dipahami maka saya akan coba buat method yang sama hanya dengan nama yang berbeda dengan sedikit penyesuaian. Untuk lebih lanjut silahkan dilihat pada potongan source code dibawah ini.

    public void getPropertyInduk(Object obj) {
        try {
            Class superClass = obj.getClass().getSuperclass();
            for (Field field : superClass.getDeclaredFields()) {
                boolean isAccessible = field.isAccessible();                
                System.out.println("Nama Variabel: " + field.getName());
                System.out.println("Accessible   : " + isAccessible);
                System.out.println("Modifier     : " + this.getNilaiModifier(field.getModifiers()));
                System.out.println("N i l a i    : " + this.getValue(field, obj, isAccessible) + "\n");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

Sampai disini dahulu kegiatan praktikum kali ini dan jika anda ingin lihat hasilnya silahkan di download source code tersebut pada bagian paling bawah dari tulisan ini. Semoga apa yang saya tulis bisa memberi sedikit pencerahan. Selamat Mencoba.

Source Code: JavaReflection




2 Responses

Page 1 of 1
  1. black magic
    black magic 24 November 2012 at 10:58 pm |

    itu akses propertinya di buat kelas sendiri atau dalam kelas induk? mohon pencerahaannya

Leave a Reply

[+] kaskus emoticons nartzco