Medan Peribadi Boleh Dicapai melalui Refleksi Java
Mengakses medan peribadi melalui refleksi ialah topik yang diperdebatkan dalam pengaturcaraan Java. Dengan teknik ini, seseorang boleh memintas sekatan akses yang dikenakan oleh enkapsulasi dan mendapatkan semula nilai medan persendirian, menimbulkan kebimbangan tentang pelanggaran prinsip enkapsulasi.
Pertimbangkan contoh berikut:
class Test { private String str; public void setStr(String value) { str = value; } }
Timbul persoalan: Adakah mungkin untuk mendapatkan nilai medan persendirian 'str' menggunakan pantulan?
Jawapan:
Ya, ia sememangnya mungkin, dengan syarat kebenaran keselamatan yang sesuai diberikan. Dengan menggunakan kaedah Field.setAccessible(true), anda boleh memberikan akses kepada medan peribadi daripada kelas yang berbeza.
Coretan kod berikut menunjukkan cara untuk mencapai ini:
import java.lang.reflect.*; class Other { private String str; public void setStr(String value) { str = value; } } class Test { public static void main(String[] args) // Just for the ease of a throwaway test. Don't // do this normally! throws Exception { Other t = new Other(); t.setStr("hi"); Field field = Other.class.getDeclaredField("str"); field.setAccessible(true); Object value = field.get(t); System.out.println(value); } }
Awas:
Adalah sangat tidak digalakkan untuk mengakses medan peribadi dalam senario biasa. Dengan berbuat demikian, anda mengabaikan mekanisme enkapsulasi kelas, yang berpotensi mengatasi semakan pengesahan penting atau mengubah suai medan lain secara tidak dijangka.
Atas ialah kandungan terperinci Bolehkah Java Reflection Bypass Enkapsulasi untuk Mengakses Medan Peribadi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!