Refleksi Itu Apa?
Refleksi adalah API yang mendukung pembuatan instance kelas yang diinginkan melalui objek tipe Class yang dimuat di area heap, dan mendukung penggunaan field dan method instance tanpa memperhatikan pengontrol akses.
Di sini, kelas yang dimuat berarti bahwa setelah JVM Class Loader menyelesaikan pemuatan file kelas, objek tipe Classyang berisi informasi kelas dibuat dan disimpan di area heap memori. Perhatikan bahwa ini berbeda dengan objek yang dibuat melalui kata kunci new. Jika Anda kurang memahami objek tipe Class ini, Anda dapat memeriksa dokumentasi JDK untuk objek java.lang.class.
Cara Penggunaan
Sebelum menggunakan refleksi, Anda perlu mendapatkan objek tipe Class yang dimuat di area heap. Ada tiga cara untuk melakukannya.
- Mendapatkan melalui Kelas.class
- Mendapatkan melalui Instance.getClass()
- Mendapatkan melalui Class.forName("NamaKelas")
Anda dapat melihat bahwa instance tipe Class yang diperoleh dengan tiga metode tersebut semuanya sama. Hashcode-nya sama, jadi Anda dapat menggunakannya sesuai kebutuhan.
Sekarang, melalui tipe Class yang telah Anda peroleh, Anda dapat membuat instance kelas tersebut dan mengakses field dan method instance tanpa memperhatikan pengontrol akses. Pertama, mari kita buat instance kelasnya.
Anda dapat memperoleh konstruktor melalui getConstructor() dan membuat instance Member secara dinamis melalui newInstance().
Terakhir, mari kita akses dan gunakan field dan method instance tanpa memperhatikan pengontrol akses.
Anda dapat memperoleh semua variabel instance kelas melalui getDeclaredFileds(), mendapatkan nilai field melalui get(), dan memodifikasi nilai field melalui set(). Perlu diperhatikan bahwa saat mengakses field dengan pengontrol akses private, Anda perlu menetapkan argumen setAccessible() menjadi true.
Method juga dapat diperoleh melalui getDeclaredMethod(). Saat itu, Anda perlu menyertakan nama method dan tipe parameter sebagai argumen. Sama seperti field, saat mengakses method dengan pengontrol akses private, Anda perlu menetapkan argumen setAccessible() menjadi true. Terakhir, Anda dapat memanggil method yang diperoleh melalui API Refleksi melalui method invoke().
Kelebihan dan Kekurangan
- Kelebihan
- Memiliki fleksibilitas untuk membuat instance kelas dan mengakses field dan method tanpa memperhatikan pengontrol akses pada saat runtime.
- Kekurangan
- Menghancurkan enkapsulasi.
- Karena instance dibuat pada saat runtime, tipe tidak dapat diperiksa pada saat compile time.
- Karena instance dibuat pada saat runtime, sulit untuk memahami alur kerja yang spesifik.
- Kinerja lebih lambat saat mengakses field dan method melalui refleksi daripada akses langsung. (Tidak selalu lebih lambat dalam semua situasi).
Alasan Penggunaan
Melalui API Refleksi, Anda dapat mengakses informasi kelas dan memanipulasinya sesuai keinginan pada saat runtime. Bahkan field dan method yang dideklarasikan sebagai private pun dapat dimanipulasi. Karena enkapsulasi merupakan hal yang penting dalam desain berorientasi objek, ini terlihat seperti teknik yang seharusnya tidak digunakan.
Pada tahap konsol dengan skala kecil, developer dapat memahami semua objek dan relasi dependensi yang digunakan dalam program pada saat compile time. Namun, pada tahap pengembangan dengan skala besar seperti framework, sulit untuk memahami banyak objek dan relasi dependensi. Dalam kasus ini, refleksi dapat digunakan untuk membuat kelas secara dinamis dan membuat relasi dependensi.
Misalnya, pada Spring Bean Factory, Anda dapat melihat bahwa dengan hanya menambahkan anotasi @Controller, @Service, @Repository, Bean Factory akan secara otomatis membuat dan mengelola kelas yang memiliki anotasi tersebut. Developer tidak pernah memberi tahu Bean Factory tentang kelas tersebut, tetapi ini dimungkinkan karena refleksi. Pada saat runtime, jika kelas yang memiliki anotasi tersebut ditemukan, refleksi digunakan untuk membuat instance kelas tersebut, menyuntikkan field yang diperlukan, dan menyimpannya di Bean Factory.
Tentu saja, seperti yang telah disebutkan di atas, karena merusak enkapsulasi, sebaiknya hanya digunakan dalam situasi yang sangat diperlukan.
Komentar0