Rumah  >  Artikel  >  Java  >  Biarkan anda memahami mekanisme refleksi JAVA (perkongsian ringkasan)

Biarkan anda memahami mekanisme refleksi JAVA (perkongsian ringkasan)

WBOY
WBOYke hadapan
2022-03-16 18:02:451738semak imbas

Artikel ini membawa anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan isu yang berkaitan dengan mekanisme pantulan, termasuk apa itu pantulan, apa yang boleh dilakukan pantulan, API berkaitan pantulan, dll. Semoga ia membantu semua orang.

Pembelajaran yang disyorkan: "Tutorial Pembelajaran Java"

1.

Konsep yang sangat penting dalam pembangunan Java ialah mekanisme refleksi Java, yang juga merupakan salah satu ciri penting Java.

Konsep refleksi pertama kali dicadangkan oleh Smith pada tahun 1982. Ia terutamanya merujuk kepada keupayaan program untuk mengakses, mengesan dan mengubah suai keadaan atau tingkah lakunya sendiri Melalui refleksi, kaedah persendirian dan sifat persendirian boleh dipanggil . Beberapa kerangka juga menggunakan prinsip refleksi.

Refleksi (refleksi) adalah kunci untuk dianggap sebagai bahasa dinamik Mekanisme refleksi membolehkan program mendapatkan maklumat dalaman mana-mana kelas
semasa pelaksanaan dengan bantuan. API Refleksi, dan boleh mengendalikannya secara langsung Sifat dalaman dan kaedah mana-mana objek.

Kelas mempunyai berbilang komponen, seperti pembolehubah ahli, kaedah, pembina, dll. Refleksi adalah untuk memuatkan kelas dan membedah pelbagai komponen kelas.

2. Apa yang boleh dilakukan oleh refleksi?

Mekanisme refleksi Java mengetahui struktur asas kelas Keupayaan untuk mengesan struktur kelas Java ini adalah apa yang kami panggil "pemeriksaan kendiri" kelas Java. Sebagai contoh, dalam eclipse, dengan satu klik, alat penyusunan secara automatik akan menyenaraikan semua kaedah dan sifat yang boleh digunakan oleh objek untuk dipilih oleh pengguna. Ini menggunakan prinsip refleksi Java untuk mengesan dan memeriksa sendiri objek yang kami cipta.

Refleksi boleh dilakukan:

  • Tentukan kelas yang dimiliki oleh mana-mana objek pada masa larian; >Hakim pembolehubah ahli dan kaedah mana-mana kelas pada masa jalankan; anotasi pada masa jalankan;
  • menjana ejen dinamik;
  • : kaedah
  • : harta
  • : pembina
4 >

(1) Pengenalan:
  • java.lang.ClassSelepas atur cara melepasi arahan javac.exe, ia akan menjana satu atau lebih bytecode Fail (akhiran .class). Kemudian kami menggunakan arahan java.exe untuk mentafsir dan menjalankan fail bytecode tertentu. Setara dengan memuatkan fail bytecode tertentu ke dalam memori. Proses ini dipanggil memuatkan
  • kelas
  • . Kelas yang dimuatkan ke dalam memori dipanggil kelas masa jalan dan kelas masa jalan ini digunakan sebagai contoh Kelas. java.lang.reflect.Method
  • Dalam erti kata lain, contoh Kelas sepadan dengan kelas masa jalan.
  • java.lang.reflect.FieldKelas waktu jalan yang dimuatkan ke dalam memori akan dicache untuk tempoh masa tertentu. Dalam masa ini, kita boleh mendapatkan kelas masa jalan ini dengan cara yang berbeza
  • .
  • java.lang.reflect.Constructor
  • (2). Proses pemuatan kelas:

Pemuatan:

Dalam Objek baharu kami atau apabila menggunakan

, pemuat kelas akan memuatkan kelas ke dalam memori dan mencipta objek Kelas

Bagaimana untuk mendapatkan objek Kelas?


Kelas.

Objek.

Class.forName("包名.类")(ClassLoader)("Nama pakej. Kelas");


Pautan:
  • classKerja yang dilakukan oleh pautan adalah untuk mengesahkan sama ada kod bait itu sah. Peruntukkan ruang memori untuk statik dan mulakannya (bukan pemulaan sebenar, hanya berikan jenis pembolehubah yang sepadan nilai lalai, seperti int kepada 0, dua kali ganda kepada 0.0)

  • Nyahpasang: getClass()

  • Punggah dari memori (kita tidak perlu peduli bila hendak memunggah, ia dilakukan oleh JVM)

    Class.forName

    (3) Pemuat kelas

Kelas (CLASS) hanya boleh dijalankan selepas dimuatkan ke dalam JVM. Apabila menjalankan program yang ditentukan, JVM akan memuatkan fail .class yang disusun ke dalam memori mengikut keperluan dan peraturan tertentu, dan menyusunnya ke dalam aplikasi Java yang lengkap. Proses pemuatan ini diselesaikan oleh pemuat kelas, khususnya, ia dilaksanakan oleh ClassLoader dan subkelasnya. Pemuat kelas itu sendiri juga merupakan kelas Intipatinya adalah untuk membaca fail kelas dari cakera keras ke dalam memori! Klasifikasi pemuat kelas:
  1. BootStrap: bertanggungjawab terutamanya untuk memuatkan perpustakaan kelas teras (java.lang.*, dsb.), membina ExtClassLoader dan APPClassLoader; bertanggungjawab terutamanya untuk memuatkan Direktori jre/lib/ext Beberapa pakej balang lanjutan di bawah
  2. ExtClassLoader: bertanggungjawab untuk memuatkan kelas fungsi utama aplikasi (fail java yang ditulis sendiri dimuatkan oleh pemuat kelas ini); >
  3. AppClassLoader:
  4. Mekanisme perwakilan (penghantaran) ibu bapa:
System.out.println("app:" + System.getProperty("java.class.path"));
System.out.println("ext:" + System.getProperty("java.ext.dirs"));
System.out.println("----bootstrap---");
String[] str = System.getProperty("sun.boot.class.path").split(";");

for (String s : str) {
    System.out.println(s);
}

Apabila fail seperti Hello.class hendak dimuatkan. Tidak kira pemuat kelas tersuai kami, kami akan menyemak dahulu sama ada ia telah dimuatkan dalam AppClassLoader Jika ya, tidak perlu memuatkannya lagi. Jika tidak, pemuat induk akan diperoleh, dan kaedah loadClass pemuat induk akan dipanggil. Dengan cara yang sama, kelas induk akan terlebih dahulu menyemak sama ada ia telah dimuatkan, dan jika tidak, naik. Beri perhatian kepada proses rekursif ini Sehingga ia mencapai Bootstrap classLoader, ia sedang menyemak sama ada ia telah dimuatkan dan tidak akan memilih untuk memuatkannya dengan sendirinya. Sehingga BootstrapClassLoader, tiada pemuat induk Pada masa ini, saya mula mempertimbangkan sama ada saya boleh memuatkannya, saya akan tenggelam ke pemuat kanak-kanak untuk memuatkannya, sehingga ke lapisan bawah. Jika tiada pemuat boleh memuatkannya, ia akan Membuang ClassNotFoundException. Jadi adakah sesiapa mempunyai soalan berikut?

Mengapa mekanisme ini direka bentuk

Satu kelebihan reka bentuk ini ialah jika seseorang ingin menggantikan kelas peringkat sistem: String.java. Mengganggu pelaksanaannya. Di bawah mekanisme ini, kelas sistem ini telah dimuatkan oleh Bootstrap classLoader (mengapa? Kerana apabila kelas perlu dimuatkan, perkara pertama yang cuba dimuatkan ialah BootstrapClassLoader), jadi pemuat kelas lain tidak Memuatkan lagi apabila peluang yang timbul menghalang implantasi kod berbahaya ke tahap tertentu.

Pembelajaran yang disyorkan: "

tutorial java

"

Atas ialah kandungan terperinci Biarkan anda memahami mekanisme refleksi JAVA (perkongsian ringkasan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam