Kerugian refleksi secara umum
Refleksi lebih sulit dipahami daripada kode garis lurus.
Dalam pengalaman saya, refleksi adalah fitur "tingkat ahli" di Jawa. Saya berpendapat bahwa sebagian besar programmer tidak pernah menggunakan refleksi secara aktif (mis. Mengkonsumsi perpustakaan yang menggunakan refleksi tidak masuk hitungan). Itu membuat kode menggunakannya lebih sulit untuk dipahami oleh para programmer ini.
Kode refleksi tidak dapat diakses untuk analisis statis
Misalkan saya memiliki seorang pengambil getFoo
di kelas saya dan saya ingin mengubah nama menjadi getBar
. Jika saya tidak menggunakan refleksi, saya bisa mencari basis kode getFoo
dan akan menemukan setiap tempat yang menggunakan pengambil sehingga saya dapat memperbaruinya, dan bahkan jika saya melewatkannya, kompiler akan mengeluh.
Tetapi jika tempat yang menggunakan pengambil adalah sesuatu seperti callGetter("Foo")
dan callGetter
tidak getClass().getMethod("get"+name).invoke(this)
, maka metode di atas tidak akan menemukannya, dan kompiler tidak akan mengeluh. Hanya ketika kode tersebut benar-benar dieksekusi Anda akan mendapatkan NoSuchMethodException
. Dan bayangkan rasa sakit yang Anda alami jika pengecualian itu (yang dilacak) ditelan oleh callGetter
karena "itu hanya digunakan dengan string hard-coded, itu tidak dapat benar-benar terjadi". (Tidak ada yang akan melakukan itu, seseorang mungkin berdebat? Kecuali bahwa OP melakukan hal itu dalam jawaban SO-nya. Jika bidang ini diganti namanya, pengguna setter generik tidak akan pernah melihat, kecuali bug yang sangat tidak jelas dari setter diam-diam tidak melakukan apa-apa. Pengguna pengambil mungkin, jika mereka beruntung, memperhatikan output konsol dari pengecualian yang diabaikan.)
Kode refleksi bukan tipe-diperiksa oleh kompiler
Ini pada dasarnya adalah sub-poin besar di atas. Tentang kode refleksi Object
. Jenis diperiksa pada saat runtime. Kesalahan ditemukan oleh unit test, tetapi hanya jika Anda memiliki jangkauan. ("Ini hanya pengambil, saya tidak perlu mengujinya.") Pada dasarnya, Anda kehilangan keuntungan menggunakan Java lebih dari Python mendapatkan Anda di tempat pertama.
Kode refleksi tidak tersedia untuk optimasi
Mungkin tidak dalam teori, tetapi dalam praktiknya, Anda tidak akan menemukan JVM yang inline atau membuat cache inline untuk Method.invoke
. Panggilan metode normal tersedia untuk optimasi seperti itu. Itu membuat mereka jauh lebih cepat.
Kode pantulan umumnya lambat
Pencarian metode dinamis dan pemeriksaan jenis yang diperlukan untuk kode refleksi lebih lambat daripada panggilan metode normal. Jika Anda mengubah rajutan satu baris murah itu menjadi binatang pantulan, Anda mungkin (saya belum mengukur ini) akan melihat beberapa urutan besarnya perlambatan.
Kekurangan dari pengambil / penyetel generik secara khusus
Itu hanya ide yang buruk, karena kelas Anda sekarang tidak memiliki enkapsulasi lagi. Setiap bidang yang dimilikinya dapat diakses. Anda mungkin juga membuat semuanya publik.