Di Java, private
pengubah akses dianggap aman karena tidak terlihat di luar kelas. Kemudian dunia luar juga tidak tahu tentang metode itu.
Tapi saya pikir refleksi Java dapat digunakan untuk melanggar aturan ini. Pertimbangkan kasus berikut:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Sekarang dari kelas lain saya akan mendapatkan Info:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
Saat ini saya hanya berpikir metode private masih aman karena untuk melakukan hal-hal seperti diatas kita harus mengetahui nama metode. Tetapi jika kelas yang berisi metode privat yang ditulis oleh orang lain, kami tidak memiliki visibilitasnya.
Tetapi poin saya menjadi tidak valid karena baris kode di bawah ini.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Sekarang ini method[]
berisi semua hal yang perlu dilakukan di atas. Pertanyaan saya adalah, adakah cara untuk menghindari hal semacam ini dilakukan dengan menggunakan refleksi Java?
Saya mengutip beberapa poin dari Dokumentasi Java untuk memperjelas pertanyaan saya.
Tips Memilih Tingkat Akses:
Jika pemrogram lain menggunakan kelas Anda, Anda ingin memastikan bahwa kesalahan dari penyalahgunaan tidak dapat terjadi. Tingkat akses dapat membantu Anda melakukan ini. Gunakan tingkat akses paling ketat yang masuk akal untuk anggota tertentu. Gunakan pribadi kecuali Anda punya alasan kuat untuk tidak melakukannya.
getDeclaredMethods
akan mengembalikan nama yang terlihat seperti sampah.