Saya menggunakan beberapa anotasi untuk secara dinamis mengatur nilai bidang di kelas. Karena saya ingin melakukan ini terlepas dari apakah itu publik, dilindungi, atau pribadi, saya selalu memanggil setAccessible(true)
objek Field sebelum memanggil set()
metode ini. Pertanyaan saya adalah seperti apa dampak setAccessible()
panggilan tersebut di lapangan itu sendiri?
Lebih khusus lagi, katakan itu adalah bidang pribadi dan kumpulan kode panggilan ini setAccessible(true)
. Jika beberapa tempat lain dalam kode kemudian mengambil bidang yang sama melalui refleksi, apakah bidang tersebut sudah dapat diakses? Atau apakah metode getDeclaredFields()
dan getDeclaredField()
mengembalikan instance baru dari objek Field setiap kali?
Saya kira cara lain untuk menyatakan pertanyaannya adalah jika saya menelepon setAccessible(true)
, seberapa penting untuk mengembalikannya ke nilai asli setelah saya selesai?
sumber
throws Exception
juga menanganiNoSuchFieldException
, tetapi Anda mungkin ingin menanganinya dengan cara yang lebih rumit.The
getDeclaredField
Metode harus kembali objek baru setiap kali, justru karena objek ini memiliki bisa berubahaccessible
bendera. Jadi tidak perlu mengatur ulang bendera. Anda dapat menemukan detail lengkapnya di postingan blog ini .sumber
Seperti yang ditunjukkan oleh poster lain,
setAccessible
hanya berlaku untuk instance itu dari Andajava.lang.reflect.Field
, jadi pengaturan aksesibilitas kembali ke keadaan semula tidak diperlukan.Namun...
Jika Anda ingin panggilan
field.setAccessible(true)
Anda terus-menerus, Anda perlu menggunakan metode yang mendasari dalamjava.lang.Class
danjava.lang.reflect.Field
. Masyarakat menghadapi metode mengirimkan salinan dariField
contoh, sehingga "lupa" setelah setiap kali Anda melakukan sesuatu seperticlass.getField(name)
Pembaruan : Implementasi ini untuk Java 8, versi yang akan datang mengubah backend yang merusak ini. Konsep yang sama tetap berlaku meskipun Anda benar-benar ingin melanjutkan strategi ini.
sumber
sumber