Rumah Java javaTutorial Menggunakan Kaedah dan Pemegang Pembolehubah dalam Java untuk Akses dan Manipulasi Objek Masa Jalan

Menggunakan Kaedah dan Pemegang Pembolehubah dalam Java untuk Akses dan Manipulasi Objek Masa Jalan

Sep 10, 2024 pm 08:32 PM

Using Method and Variable Handles in Java for Runtime Object Access and Manipulation

Pengendalian refleksi dan kaedah/var ialah dua ciri berkuasa dalam Java yang membolehkan pembangun mengakses dan memanipulasi objek pada masa jalan. Walau bagaimanapun, mereka berbeza dalam cara mereka mengakses dan mengendalikan objek.

Mari kita lihat contoh cara menggunakan refleksi untuk mengakses kaedah dalam kelas. Kita akan mulakan dengan kelas ringkas yang dipanggil "MyClass" yang mempunyai pembolehubah rentetan peribadi dan kaedah pengambil untuk pembolehubah itu. Untuk mencipta objek ini, kita boleh menggunakan instantiasi biasa:

MyClass objectInstance = new MyClass("John Doe");
Salin selepas log masuk

Untuk mengakses kaedah menggunakan refleksi, kita perlu terlebih dahulu mendapatkan kelas contoh objek kita menggunakan kaedah getClass(). Kemudian, kita boleh menggunakan kaedah getDeclaredMethod() untuk mencari kaedah yang ingin kita akses, dalam kes ini, "getName". Akhir sekali, kita perlu menggunakan kaedah menggunakan kaedah invoke() dan lulus dalam contoh objek kita. Berikut ialah kod untuk proses ini:

Class<?> clazz = objectInstance.getClass();
Method method = clazz.getDeclaredMethod("getName");
String value = (String) method.invoke(objectInstance);
System.out.println(value); // prints "John Doe"
Salin selepas log masuk

Sebaliknya, pengendalian kaedah, yang terdapat dalam kelas MethodHandles, menyediakan cara yang lebih selamat dan lebih optimum untuk mengakses kaedah. Ini kerana ia direka khusus untuk tujuan ini dan dipertingkatkan untuk pengoptimuman JVM.

Menggunakan pemegang kaedah untuk mengakses kaedah adalah serupa dengan menggunakan pantulan. Kami mulakan dengan mendapatkan kelas contoh objek kami. Kemudian, kami menggunakan kaedah findVirtual() pada MethodHandles untuk mencari kaedah yang ingin kami akses. Seterusnya, kami memanggil kaedah menggunakan kaedah invoke() dan lulus dalam contoh objek kami. Berikut ialah kod untuk proses ini:

Class<?> clazz = objectInstance.getClass();
MethodHandle handle = MethodHandles.lookup().findVirtual(clazz, "getName", methodType(String.class));
String value = (String) handle.invoke(objectInstance);
System.out.println(value);  // Prints “John Doe”
Salin selepas log masuk

Walau bagaimanapun, terdapat had kepada kaedah yang boleh dilakukan oleh pengendalian. Mereka tidak boleh mengendalikan tugas seperti membuat kelas instantiate, yang boleh dilakukan dengan refleksi.

Untuk mempamerkan kuasa pengendalian kaedah, mari kita lihat cara ia boleh digunakan untuk mengakses terus medan peribadi dalam kelas. Katakan kelas "MyClass" kami mempunyai pembolehubah rentetan peribadi yang dipanggil "nama". Kita boleh menggunakan refleksi untuk mengaksesnya, tetapi menggunakan pemegang kaedah ialah alternatif yang lebih selamat.

Untuk mengakses terus medan peribadi menggunakan pantulan, kita perlu mendapatkan kelas contoh objek kita terlebih dahulu. Kemudian, kami menggunakan kaedah getDeclaredField() untuk mencari medan yang ingin kami akses, dalam kes ini, "nama". Walau bagaimanapun, memandangkan medan ini adalah peribadi, kita perlu menggunakan kaedah setAccessible() untuk menetapkan kebolehaksesannya kepada benar. Akhir sekali, kita boleh menggunakan kaedah get() untuk mendapatkan semula nilai medan. Berikut ialah kod untuk proses ini:

Class<?> clazz = objectInstance.getClass(); 
Field field = clazz.getDeclaredField("name"); 
field.setAccessible(true); 
String value = (String) field.get(objectInstance);
System.out.println(value); // prints “John Doe”
Salin selepas log masuk

Menggunakan pemegang kaedah, prosesnya adalah serupa. Kami mulakan dengan mendapatkan kelas contoh objek kami, dan kemudian kami menggunakan kaedah privateLookupIn() pada MethodHandles untuk menghormati pengubah akses medan (kerana ia peribadi). Seterusnya, kami menggunakan kaedah findVarHandle() untuk mencari medan yang ingin kami akses. Akhir sekali, kita boleh menggunakan kaedah get() untuk mendapatkan semula nilainya. Berikut ialah kod untuk proses ini:

Class<?> clazz = objectInstance.getClass(); 
VarHandle handle = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup()).findVarHandle(clazz, "name", String.class);
String value = (String) handle.get(objectInstance);
System.out.println(value); // prints “John Doe”
Salin selepas log masuk

Adalah disyorkan untuk membuat seketika pemegang secara statik atas sebab prestasi, tetapi ini memerlukan mengetahui nama kelas. Jika anda tidak tahu nama kelas, pendekatan ini tidak boleh digunakan.

Satu had pengendalian kaedah ialah ia tidak menyediakan cara untuk mengendalikan pengecualian yang diperiksa. Pelbagai operasi pada pemegang kaedah dan pemegang var membuang pengecualian yang diperiksa yang mesti ditangkap dan diisytiharkan dalam kod pengeluaran.

Kesimpulannya, kaedah dan pemegang pembolehubah menyediakan julat keupayaan terfokus dalam JDK untuk mencari metadata kelas dan mengakses kaedah dan medan di luar sekatan Java biasa. Walaupun mereka tidak merangkumi semua keupayaan refleksi, mereka menawarkan alternatif yang lebih selamat dan lebih optimum untuk tugasan ini.

Alami cara terbaik untuk belajar untuk Pensijilan Java dengan Rancangan Kajian MyExamCloud dan nikmati ujian amalan percuma.

Atas ialah kandungan terperinci Menggunakan Kaedah dan Pemegang Pembolehubah dalam Java untuk Akses dan Manipulasi Objek Masa Jalan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Adakah perisian keselamatan syarikat menyebabkan aplikasi gagal dijalankan? Bagaimana cara menyelesaikan masalah dan menyelesaikannya? Adakah perisian keselamatan syarikat menyebabkan aplikasi gagal dijalankan? Bagaimana cara menyelesaikan masalah dan menyelesaikannya? Apr 19, 2025 pm 04:51 PM

Penyelesaian masalah dan penyelesaian kepada perisian keselamatan syarikat yang menyebabkan beberapa aplikasi tidak berfungsi dengan baik. Banyak syarikat akan menggunakan perisian keselamatan untuk memastikan keselamatan rangkaian dalaman. …

Bagaimana untuk memudahkan isu pemetaan medan dalam dok sistem menggunakan mapstruct? Bagaimana untuk memudahkan isu pemetaan medan dalam dok sistem menggunakan mapstruct? Apr 19, 2025 pm 06:21 PM

Pemprosesan pemetaan medan dalam dok sistem sering menemui masalah yang sukar ketika melaksanakan sistem dok: bagaimana untuk memetakan medan antara muka sistem dengan berkesan ...

Bagaimana dengan elegan mendapatkan nama pemboleh ubah kelas entiti untuk membina keadaan pertanyaan pangkalan data? Bagaimana dengan elegan mendapatkan nama pemboleh ubah kelas entiti untuk membina keadaan pertanyaan pangkalan data? Apr 19, 2025 pm 11:42 PM

Apabila menggunakan Mybatis-Plus atau Rangka Kerja ORM yang lain untuk operasi pangkalan data, sering diperlukan untuk membina syarat pertanyaan berdasarkan nama atribut kelas entiti. Sekiranya anda secara manual setiap kali ...

Bagaimanakah saya menukar nama kepada nombor untuk melaksanakan penyortiran dan mengekalkan konsistensi dalam kumpulan? Bagaimanakah saya menukar nama kepada nombor untuk melaksanakan penyortiran dan mengekalkan konsistensi dalam kumpulan? Apr 19, 2025 pm 11:30 PM

Penyelesaian untuk menukar nama kepada nombor untuk melaksanakan penyortiran dalam banyak senario aplikasi, pengguna mungkin perlu menyusun kumpulan, terutama dalam satu ...

Bagaimanakah Idea IntelliJ mengenal pasti nombor port projek boot musim bunga tanpa mengeluarkan log? Bagaimanakah Idea IntelliJ mengenal pasti nombor port projek boot musim bunga tanpa mengeluarkan log? Apr 19, 2025 pm 11:45 PM

Mula musim bunga menggunakan versi IntelliJideaultimate ...

Bagaimana cara menukar objek Java dengan selamat ke array? Bagaimana cara menukar objek Java dengan selamat ke array? Apr 19, 2025 pm 11:33 PM

Penukaran objek dan tatasusunan Java: Perbincangan mendalam tentang risiko dan kaedah penukaran jenis cast yang betul Banyak pemula Java akan menemui penukaran objek ke dalam array ...

Platform e-dagang SKU dan Reka Bentuk Pangkalan Data SPU: Bagaimana untuk mengambil kira kedua-dua atribut yang ditakrifkan oleh pengguna dan produk yang tidak berkesudahan? Platform e-dagang SKU dan Reka Bentuk Pangkalan Data SPU: Bagaimana untuk mengambil kira kedua-dua atribut yang ditakrifkan oleh pengguna dan produk yang tidak berkesudahan? Apr 19, 2025 pm 11:27 PM

Penjelasan terperinci mengenai reka bentuk jadual SKU dan SPU di platform e-dagang Artikel ini akan membincangkan isu reka bentuk pangkalan data SKU dan SPU dalam platform e-dagang, terutamanya bagaimana menangani jualan yang ditentukan pengguna ...

Bagaimana dengan elegan mendapatkan syarat pertanyaan bangunan pembolehubah kelas entiti apabila menggunakan tkmybatis untuk pertanyaan pangkalan data? Bagaimana dengan elegan mendapatkan syarat pertanyaan bangunan pembolehubah kelas entiti apabila menggunakan tkmybatis untuk pertanyaan pangkalan data? Apr 19, 2025 pm 09:51 PM

Apabila menggunakan tkmybatis untuk pertanyaan pangkalan data, bagaimana dengan anggun mendapatkan nama pembolehubah kelas entiti untuk membina keadaan pertanyaan adalah masalah biasa. Artikel ini akan ...

See all articles