Rumah  >  Artikel  >  Java  >  Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

Java后端技术全栈
Java后端技术全栈ke hadapan
2023-08-23 15:05:471578semak imbas

.

Dapatkan strim binari kelas melalui nama kelas penuh

Uraikan aliran binari kelas ke dalam struktur data dalam kawasan kaedahBuat instance kelas java.lang.Class untuk mewakili jenis, sebagai kawasan kaedah Masuk akses kelas

"Terdapat banyak cara untuk mendapatkan aliran binari kelas melalui nama kelas penuh"
  1. Dapatkan dari pakej zip
  2. Dapatkannya daripada rangkaian
  3. Penjanaan pengiraan masa jalan, seperti teknologi proksi dinamik
Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)...

"Untuk fasa pemuatan jenis bukan tatasusunan, anda boleh menggunakan jenis bukan tatasusunan pemuat kelas mesin maya Java untuk diselesaikan, atau anda boleh menggunakan Pemuat kelas tersuai pengguna untuk melengkapkan"
  1. Pautan

    "Peringkat pemautan ini terbahagi kepada 3 bahagian, pengesahan, penyediaan dan analisis"

    "Peringkat pengesahan ialah terutamanya untuk memastikan Kelas Format fail adalah betul dan tidak akan membahayakan keselamatan mesin maya apabila dijalankan."

    Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)Terdapat banyak peraturan dalam fasa pengesahan, tetapi ia dibahagikan secara kasar kepada empat peringkat berikut

    "Saya tidak akan menerangkan butiran khusus secara terperinci, anda boleh melihat " "Pemahaman mendalam tentang Mesin Maya Java", artikel ini lebih suka membuat ringkasan dan memahami keseluruhan proses pemuatan kelas tanpa menghuraikan butiran Peruntukkan memori untuk pembolehubah statik kelas dan mulakannya kepada nilai lalai"

    Nilai lalai jenis data biasa adalah seperti berikut
    int panjangfloatdoubleboolean
    Jenis data Nilai lalai
    bait (bait)0
    short short
    0
    0L
    0.0f
    0.0d
    false
    char 'u0000'
    rujukan null

    "Jika atribut ConstantValue wujud dalam jadual atribut medan pembolehubah statik kelas, pernyataan tugasan akan dilaksanakan secara langsung"

    Jadi dalam keadaan apakah atribut ConstantValue wujud dalam jadual atribut medan pembolehubah statik kelas ?

    1. Pembolehubah statik kelas ialah jenis data asas, dan diubah suai oleh muktamad
    2. Pembolehubah statik kelas ialah jenis Rentetan, diubah suai secara muktamad, dan diberi nilai dalam bentuk literal

    untuk memudahkan melihat bait kod fail Kelas, saya memuat turun pemapar jclasslib Bytecode pemalam dalam IDEA, yang sangat mudah. Gunakan kod berikut untuk mengesahkannya dalam bentuk bytecode

    public class Person {
    
        private static int age = 10;
        private static final int length = 160;
        private static final String name = "name";
        private static final String loc = new String("loc");
    }
    Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)"Jadi atribut panjang dan nama akan diberikan nilai yang ditentukan oleh ConstantValue dalam peringkat penyediaan"

    "Kemudian pada peringkat manakah atribut umur dan lokasi ditetapkan? Ia dalam fasa pemulaan, yang akan diperkenalkan secara terperinci kemudian." kelas, antara muka, medan dan kaedah ke dalam rujukan langsung 》Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)Rujukan simbolik: Gunakan satu set simbol untuk menerangkan sasaran yang dirujuk Rujukan terus; penunjuk terus ke sasaran

    Sertai saya dan tulis kelas seperti berikut
    public class Student {
    
        private String name;
        private int age;
    
        public String getName() {
            return this.name;
        }
    }
    Mengambil medan sebagai contoh, objek yang sepadan dengan nama dan umur tidak menunjuk terus ke alamat memori, tetapi diterangkan dengan rentetan ( iaitu rujukan simbolik). Peringkat penghuraian adalah untuk menukar huraian ini kepada penunjuk yang terus menunjuk ke sasaran (iaitu rujukan langsung)

    初始化

    「执行类静态成员变量赋值语句和静态代码块中的语句」

    Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

    我们把上面的Student代码改成如下形式

    public class Student {
    
        private String name;
        private int age = 10;
        private static int gender = 1;
    
        {
            System.out.println("构造代码块");
        }
    
        static {
            System.out.println("静态代码块");
        }
    
        public Student() {
            System.out.println("构造函数");
        }
    
        public String getName() {
            return this.name;
        }
    }

    可以看到字节码中包含了3个方法,getName方法我们知道,7e51f00a783d7eb8f68358439dee7daf和583d030be372af71281df966e84181a5方法里面执行了哪些逻辑?Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)从字节码的角度分析一波

    「7e51f00a783d7eb8f68358439dee7daf方法」

    Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

    从字节码可以看到7e51f00a783d7eb8f68358439dee7daf方法的主要逻辑为

    1. 调用父类的7e51f00a783d7eb8f68358439dee7daf方法
    2. 非静态成员变量赋值
    3. 执行构造代码块
    4. 执行构造函数

    Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)「583d030be372af71281df966e84181a5方法」Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)从字节码可以看到583d030be372af71281df966e84181a5方法的主要逻辑为

    1. Laksanakan pernyataan tugasan pembolehubah statik
    2. Laksanakan pernyataan dalam blok kod statik
    3. Satu perkara yang perlu diberi perhatian ialah "Mesin maya Java memastikan bahawa sebelum kaedah subclass dilaksanakan, kaedah 6945b419d26ab6cde99ffe0b71e46cb3kelas induk telah dilaksanakan"

    "Masih perlu memahami peranan kaedah 583d030be372af71281df966e84181a5 dan 7e51f00a783d7eb8f68358439dee7daf tentang blok kod statik, blok kod dibina dan terbina Susunan pelaksanaan fungsi "

    Saya akan meringkaskan kesimpulan terus di sini. Anda boleh menulis demo untuk mengesahkannya

    "Perintah pelaksanaan tanpa warisan"

      .
    1. Blok kod statik dan pembolehubah ahli statik, perintah pelaksanaan diberikan oleh Perintah penulisan menentukan (ia hanya akan dilaksanakan sekali)
    2. Bina blok kod dan pembolehubah ahli bukan statik, susunan pelaksanaan ditentukan oleh susunan penulisan
    3. Pembina

    "Perintah pelaksanaan dengan warisan"

    1. Statik (blok kod statik, pembolehubah ahli statik) bagi kelas kod induk, statik (blok kod ahli statik) statik (blok kod ahli statik) hanya akan dilaksanakan sekali)
    2. Bukan statik (blok kod terbina) kelas induk , pembolehubah ahli bukan statik), pembina kelas induk
    3. bukan statik (blok kod pembinaan, bukan -pembolehubah ahli statik) subkelas, pembina subkelas

    nyahpasang

    Pengumpulan sampah bukan sahaja berlaku di timbunan, tetapi juga di kawasan kaedah. Walau bagaimanapun, syarat untuk mengitar semula data jenis di kawasan kaedah adalah agak ketat

    Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)Angka berikut adalah contoh saya ingin mengitar semula kelas Simple di kawasan kaedahPenemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

    1. Anda perlu memastikan bahawa kelas Sample dan subkelasnya dalam timbunan telah dikitar semula
    2. MyClassLoader yang memuatkan kelas Sample telah dikitar semula
    3. Objek Kelas yang sepadan dengan Sampel telah dikitar semulaPenemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

    Anda boleh lihat Syarat untuk mengitar semula data jenis di kawasan kaedah agak keras, tetapi hasilnya adalah minimum, jadi sesetengah pengumpul sampah tidak akan mengitar semula data jenis di kawasan kaedah

    Ringkasan

    Proses pemuatan kelasPenemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

    Proses penugasan berubahPenemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah)

Atas ialah kandungan terperinci Penemuduga: Beritahu saya tentang proses pemuatan kelas (10 gambar rajah). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam