Saya memiliki kelas yang menggunakan XML dan refleksi untuk mengembalikan Object
s ke kelas lain.
Biasanya objek-objek ini adalah sub bidang dari objek eksternal, tetapi kadang-kadang itu adalah sesuatu yang ingin saya hasilkan dengan cepat. Saya sudah mencoba sesuatu seperti ini tetapi tidak berhasil. Saya percaya itu karena Java tidak akan mengizinkan Anda mengakses private
metode untuk refleksi.
Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");
if ("SomeObject".equals(objectName))
object = someObject;
else
object = this;
method = object.getClass().getMethod(methodName, (Class[]) null);
Jika metode yang disediakan adalah private
, gagal dengan a NoSuchMethodException
. Saya bisa menyelesaikannya dengan membuat metode public
, atau membuat kelas lain untuk menurunkannya.
Singkat cerita, saya hanya ingin tahu apakah ada cara untuk mengakses private
metode melalui refleksi.
sumber
getDeclaredMethod()
bukan hanyagetMethod()
- ini tidak akan berfungsi untuk metode pribadi.private
akses memainkan peran yang sama.Gunakan
getDeclaredMethod()
untuk mendapatkan objek Metode pribadi dan kemudian gunakanmethod.setAccessible()
untuk mengizinkannya memanggilnya.sumber
java.lang.StackOverflowError
jika saya tidak meneleponsetAccessible(true)
.Jika metode menerima tipe data non-primitif maka metode berikut dapat digunakan untuk memanggil metode pribadi dari kelas apa pun:
Parameter yang diterima adalah obj, methodName, dan parameter. Sebagai contoh
Metode concatString dapat dipanggil sebagai
sumber
Anda dapat melakukan ini menggunakan ReflectionTestUtils of Spring ( org.springframework.test.util.ReflectionTestUtils )
Contoh: jika Anda memiliki kelas dengan metode pribadi
square(int x)
sumber
Biarkan saya memberikan kode lengkap untuk eksekusi metode yang dilindungi melalui refleksi. Ini mendukung semua jenis params termasuk generik, parob autoboxed dan nilai null
Metode menggunakan apache ClassUtils untuk memeriksa kompatibilitas dari paro autobox
sumber
Satu lagi varian menggunakan library JOOR yang sangat kuat https://github.com/jOOQ/jOOR
Hal ini memungkinkan untuk memodifikasi bidang apa pun seperti konstanta statis final dan memanggil metode yang dilindungi yne tanpa menentukan kelas beton dalam hierarki warisan
sumber
Anda dapat menggunakan @Jailbreak Manifold untuk refleksi Java langsung dan aman-tipe:
@Jailbreak
membukafoo
variabel lokal di kompiler untuk akses langsung ke semua anggota dalamFoo
hierarki.Demikian pula Anda dapat menggunakan metode ekstensi jailbreak () untuk sekali pakai:
Melalui
jailbreak()
metode ini Anda dapat mengakses anggota mana pun dalamFoo
hierarki.Dalam kedua kasus kompiler menyelesaikan panggilan metode untuk Anda ketik-aman, seolah-olah metode publik, sementara Manifold menghasilkan kode refleksi yang efisien untuk Anda di bawah tenda.
Atau, jika jenisnya tidak diketahui secara statis, Anda dapat menggunakan Structural Typing untuk mendefinisikan antarmuka yang dapat dipenuhi oleh suatu jenis tanpa harus mendeklarasikan implementasinya. Strategi ini menjaga keamanan jenis dan menghindari masalah kinerja dan identitas yang terkait dengan refleksi dan kode proxy.
Temukan lebih lanjut tentang Manifold .
sumber