Rumah  >  Artikel  >  Java  >  Bagaimanakah Anda Boleh Menggunakan Kaedah Peribadi Menggunakan Refleksi di Jawa?

Bagaimanakah Anda Boleh Menggunakan Kaedah Peribadi Menggunakan Refleksi di Jawa?

Susan Sarandon
Susan Sarandonasal
2024-11-22 07:52:18797semak imbas

How Can You Invoke Private Methods Using Reflection in Java?

Invokasi Kaedah Peribadi melalui Refleksi

Di Java, penyeruan refleksi langsung kaedah persendirian tidak dibenarkan. Walau bagaimanapun, terdapat pendekatan alternatif untuk mencapai fungsi ini.

Pertimbangkan senario berikut di mana kaedah, yang pada mulanya ditakrifkan sebagai peribadi, perlu digunakan melalui 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);

Kod ini cuba untuk dapatkan rujukan kepada kaedah persendirian yang ditentukan oleh atribut "methodName". Walau bagaimanapun, pendekatan ini mencetuskan "NoSuchMethodException" kerana kaedah peribadi tidak boleh diakses melalui refleksi konvensional.

Untuk mengatasi had ini, kita boleh menggunakan kaedah getDeclaredMethod:

Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
Object r = method.invoke(object);

Kaedah getDeclaredMethod mendapatkan semula kaedah tanpa mengira keterlihatannya. Kaedah setAccessible membolehkan kami memintas sekatan akses peribadi dan menggunakan kaedah tersebut.

Awas:

  • getDeclaredMethod mencari kaedah yang diisytiharkan dalam kelas semasa sahaja. Untuk kaedah yang diwarisi, anda mungkin perlu merentasi hierarki kelas.
  • Sesetengah SecurityManagers mungkin melarang penggunaan setAccessible. Pertimbangkan untuk melaksanakan invokasi sebagai PrivilegedAction menggunakan AccessController atau Subject.

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Menggunakan Kaedah Peribadi Menggunakan Refleksi di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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