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"
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.
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:
java.lang.Class
Selepas 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 java.lang.reflect.Method
java.lang.reflect.Field
Kelas 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 berbezajava.lang.reflect.Constructor
, pemuat kelas akan memuatkan kelas ke dalam memori dan mencipta objek Kelas
Bagaimana untuk mendapatkan objek Kelas?
Class.forName("包名.类")
(ClassLoader)
("Nama pakej. Kelas");
class
Kerja 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()
Class.forName
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 ExtClassLoader:
bertanggungjawab untuk memuatkan kelas fungsi utama aplikasi (fail java yang ditulis sendiri dimuatkan oleh pemuat kelas ini); >AppClassLoader:
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?
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!