Meskipun kami biasanya berpikir bahwa mengakses bidang privat dan metode privat kelas lain melalui mekanisme refleksi JAVA adalah hal yang mungkin dilakukan, hal ini tidak terlalu sulit.
Catatan: Kode ini hanya akan berfungsi jika Anda menjalankannya di program JAVA terpisah, seperti Anda melakukan beberapa pengujian unit atau program biasa. Jika Anda mencoba menggunakan metode ini di dalam JAVA APPLET, Anda perlu sedikit memodifikasi SecurityManager. Namun, karena Anda tidak perlu sering-sering menghadapinya, saya tidak akan membahas detailnya di sini.
Berikut adalah daftar konten ini:
1. Akses bidang pribadi.
2. Akses metode pribadi.
Akses bidang pribadi:
Untuk mengakses kolom privat, Anda perlu memanggil metode Class.getDeclaredField(String name) atau Class.getDeclaredFields(). Metode Class.getField(String name) dan Class.getFields() hanya mengembalikan kolom umum, sehingga tidak berpengaruh. Berikut adalah contoh kelas yang berisi bidang pribadi, dan di bawah kelas tersebut terdapat kode yang mengakses bidang pribadi melalui refleksi.
Copy kode kodenya sebagai berikut:
kelas publik PrivateObject {
private String privateString = null; //Dideklarasikan sebagai kolom privat
Objek Pribadi Publik(String String Pribadi) {
this.privateString = privateString;
}
}
Copy kode kodenya sebagai berikut:
PrivateObject privateObject = new PrivateObject("The Private Value");// membuat instance objek
Bidang privateStringField = PrivateObject.kelas.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//Izinkan akses ke kolom pribadi
String fieldValue = (String) privateStringField.get(privateObject);//Dapatkan nilai bidang pribadi
System.out.println("fieldValue = " + fieldValue);
Kode ini akan mencetak teks "fieldValue = The Private Value", yang merupakan nilai bidang privat privateString dari objek PrivateObject.
Perhatikan bahwa kita menggunakan metode PrivateObject.class.getDeclaredfield("privateString"). Panggilan ke metode inilah yang mengembalikan bidang privat. Metode ini hanya mengembalikan field berdasarkan kelas yang ditentukan, dan tidak akan mengembalikan field yang dideklarasikan oleh kelas induk.
Perhatikan juga pernyataan yang dicetak tebal. Dengan memanggil Field.setAccessible(true), Anda menonaktifkan pemeriksaan akses untuk instance bidang tertentu ini, yang hanya efektif untuk refleksi. Sekarang Anda dapat mengaksesnya, baik itu pribadi, terlindungi, atau default, meskipun penelepon tidak berada dalam cakupan tersebut. Anda masih tidak dapat mengakses bidang tersebut melalui metode reguler karena kompiler tidak mengizinkannya.
Mengakses metode privat <BR>Untuk mengakses metode privat, Anda perlu memanggil metode Class.getDeclaredMethod(String name,Class[] parameterTypes) atau Class.getDeclaredMethods(). Metode Class.getMethod(String name,Class[] parameterTypes) dan Class.getMethods() hanya mengembalikan metode publik, sehingga tidak akan memainkan peran apa pun. Di bawah ini adalah contoh sederhana kelas dengan metode privat. Di bawah kelas adalah kode yang mengakses metode privat melalui refleksi.
Copy kode kodenya sebagai berikut:
kelas publik PrivateObject {
String pribadi privateString = null;
Objek Pribadi Publik(String String Pribadi) {
this.privateString = privateString;
}
String pribadi getPrivateString(){//Metode pribadi
kembalikan ini.privateString;
}
}
Copy kode kodenya sebagai berikut:
PrivateObject privateObject = new PrivateObject("Nilai Pribadi");
Metode privateStringMethod = PrivateObject.kelas.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(benar);
String nilai pengembalian = (String)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
Contoh kode ini mencetak teks "returnValue = The private Value", yang merupakan nilai kembalian dari metode privat.