Itu tidak curang, tetapi seperti alat apa pun, itu harus digunakan untuk apa yang dimaksudkan untuk dipecahkan. Refleksi, menurut definisi, memungkinkan Anda untuk memeriksa dan memodifikasi kode melalui kode; jika itu yang perlu Anda lakukan, maka refleksi adalah alat untuk pekerjaan itu. Refleksi adalah semua tentang meta-code: Kode yang menargetkan kode (bukan kode biasa, yang menargetkan data).
Contoh penggunaan refleksi yang baik adalah kelas antarmuka layanan web generik: Desain tipikal adalah memisahkan implementasi protokol dari fungsionalitas payload. Jadi, Anda memiliki satu kelas (sebut saja T
) yang mengimplementasikan muatan Anda, dan kelas lain yang mengimplementasikan protokol ( P
). T
cukup mudah: untuk setiap panggilan yang ingin Anda lakukan, cukup tulis satu metode yang melakukan apa pun yang seharusnya dilakukan. P
Namun, perlu memetakan panggilan layanan web ke panggilan metode. Membuat pemetaan ini generik diinginkan, karena menghindari redundansi, dan membuatnya P
sangat dapat digunakan kembali. Reflection menyediakan sarana untuk memeriksa kelas T
saat runtime dan memanggil metode-metodenya berdasarkan string yang diteruskan ke P
dalam protokol layanan web, tanpa pengetahuan kompilasi waktu dari kelasT
. Menggunakan aturan 'kode tentang kode', orang dapat berargumen bahwa kelas P
memiliki kode di kelas T
sebagai bagian dari datanya.
Namun.
Refleksi juga memberi Anda alat untuk mengatasi pembatasan sistem tipe bahasa - secara teoritis, Anda bisa melewati semua parameter sebagai tipe object
, dan memanggil metode mereka melalui refleksi. Voa, bahasa yang seharusnya menegakkan disiplin pengetikan statis yang kuat sekarang berperilaku seperti bahasa yang diketik secara dinamis dengan pengikatan yang terlambat, hanya saja sintaksanya jauh lebih rumit. Setiap contoh dari pola semacam itu yang saya lihat sejauh ini merupakan peretasan yang kotor, dan selalu, solusi dalam sistem jenis bahasa akan mungkin, dan itu akan lebih aman, lebih elegan, dan lebih efisien dalam segala hal .
Ada beberapa pengecualian, seperti kontrol GUI yang dapat terikat data ke berbagai jenis sumber data yang tidak terkait; mengamanatkan bahwa data Anda mengimplementasikan antarmuka tertentu supaya Anda dapat mengikat data itu tidak realistis, dan tidak ada programmer yang menerapkan adaptor untuk setiap jenis sumber data. Dalam hal ini, menggunakan refleksi untuk mendeteksi jenis sumber data dan menyesuaikan pengikatan data adalah pilihan yang lebih berguna.