Dalam pemrograman Java tradisional, Anda tidak perlu lagi berurusan dengan objek atau lokasi Java dari memori. Saat Anda mendiskusikan hal ini di forum, pertanyaan pertama yang muncul adalah mengapa Anda perlu mengetahui alamat objek Java? Itu adalah pertanyaan yang valid. Namun di masa lalu, kami mempunyai hak untuk melakukan uji coba. Tidak ada salahnya mengeksplorasi pertanyaan di wilayah yang belum dipetakan. Saya membuat eksperimen menggunakan paket sun company. Unsafe adalah paket milik sun.misc. Mungkin paket ini agak asing bagi Anda, lihat kode sumber dan metodenya, dan Anda akan tahu apa yang saya maksud.
Manajemen keamanan Java menyediakan persembunyian yang cukup untuk memastikan Anda tidak dapat mengacaukan memori dengan mudah. Sebagai langkah pertama, saya berpikir untuk mendapatkan lokasi memori objek Java. Sampai menjelajah, saya yakin 100% bahwa tidak mungkin menemukan lokasi alamat suatu objek di Jawa.
Dokumentasi Sun's Unsafe.java API menunjukkan bahwa kita memiliki akses ke alamat menggunakan metode objectFieldOffset. Metode ini sepertinya mengatakan, "Kelas dalam laporan mengalokasikan lokasinya di area penyimpanan tertentu." Ia juga mengatakan, "Ini hanyalah pengakses tempat cookie diteruskan ke memori heap yang tidak aman." Bagaimanapun, saya dapat mengalokasikan lokasi memori tempat suatu objek disimpan dari penyimpanan kelasnya. Anda dapat berargumentasi bahwa apa yang kita dapatkan bukanlah alamat memori fisik absolut dari suatu objek. Namun, kami mendapat alamat memori logis. Program berikut akan sangat menarik bagi Anda!
Sebagai langkah pertama, saya harus mendapatkan objek dari kelas Unsafe. Ini sulit karena konstruktornya bersifat pribadi. Ada metode bernama getUnsafe yang mengembalikan objek tidak aman. Manajemen keamanan Java mengharuskan Anda memberikan hak istimewa kode sumber. Saya menggunakan sedikit refleksi dan mendapatkan sebuah contoh. Saya tahu ada cara yang lebih baik untuk mendapatkan sebuah instance, tapi saya memilih metode berikut untuk melewati manajemen keamanan.
Untuk menggunakan objek Tidak Aman, panggil saja objectFieldOffset dan staticFieldOffset. Hasilnya adalah alamat alokasi memori kelas tersebut.
Contoh program berikut dapat berjalan di JDK1.6.
kelas publik ObjectLocation {
pribadi statis int apple = 10;
pribadi int oranye = 10;
public static void main(String[] args) melempar Pengecualian {
Tidak aman tidak aman = getUnsafeInstance();
Bidang appleField = ObjectLocation.class.getDeclaredField("apple");
System.out.println("Lokasi Apple: "
+ tidak aman.staticFieldOffset(appleField));
Bidang orangeField = ObjectLocation.class.getDeclaredField("orange");
System.out.println("Lokasi Warna Oranye : "
+ tidak aman.objectFieldOffset(orangeField));
}
getUnsafeInstance() statis pribadi yang tidak aman menampilkan SecurityException,
NoSuchFieldException, IllegalArgumentException,
Pengecualian Akses Ilegal {
Bidang theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeInstance.setAccessible(benar);
return (Tidak Aman) theUnsafeInstance.get(Unsafe.class);
}
}