Rumah > Java > javaTutorial > teks badan

Bolehkah Java Reflection Bypass Enkapsulasi untuk Mengakses Medan Peribadi?

Susan Sarandon
Lepaskan: 2024-11-01 20:11:29
asal
337 orang telah melayarinya

Can Java Reflection Bypass Encapsulation to Access Private Fields?

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;
    }
}
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan