類載入

孔德昌發表於2020-12-11

程式執行過程

從原始檔建立到程式執行,Java程式要經過兩大步驟:編譯,執行

  1. 編譯: 建立完源程式(*.java檔案)後,程式會被Java編譯器通過javac.exe命令編譯為.class檔案。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用。

  2. 執行:java類執行的過程大概可分為兩個過程:

    類的載入;

    執行。

類載入

java程式經過編譯後形成*.class檔案。位元組碼檔案通過java.exe命令通過類載入器將位元組碼檔案對應的類載入到記憶體中。

當程式主動使用某個類的時候,如果該類還未被載入到記憶體中,則系統會通過三個步驟完成對該類的初始化,這三個步驟何在一起,泛泛講稱為類的載入,細講的話,看作第一步驟
在這裡插入圖片描述

類的載入:比如說Person類,通過java.exe命令將此類位元組碼檔案載入到記憶體,並建立一個Class例項,此過程由類的載入器完成
在這裡插入圖片描述

類的連結:將類的二進位制資料合併到JRE中。將類中宣告為static的變數設定預設初始值。比如說類中有變數static int n ,在此連結過程中將n賦值為0

類的初始化:JVM負責對類進行初始化。如果定義時給變數n顯式賦了個值2,那麼在初始化環節,會將n的值有2覆蓋0。初始化中有個類構造器方法,不是之前建立類時的構造器,作用是將靜態變數有顯式值的話,做個初始化操作

public class ClassLoadingTest {
    public static void main(String[] args) {
        System.out.println(A.m);  //100
    }
}

class A{
    static {
        m = 300;
    }
    static int m = 100;
}

/**
1.首先將類A位元組碼載入到記憶體中,產生一個Class例項,對應方法區中的某一區域
2.連結,將類變數賦值為0
3.初始化,由構造器方法來完成,A的構造器方法由類變數的賦值和講臺程式碼塊中的語句按照順序合併產生
m = 300;
m = 100;
靜態程式碼塊和顯式賦值看誰先出現先賦值
*/

ClassLoader 類載入器

在這裡插入圖片描述

類載入器是用來將類裝載進記憶體的
在這裡插入圖片描述

對於自定義類,使用系統類載入器進行載入;

呼叫系統類載入器的getparent(),能獲取擴充套件類載入器;

呼叫擴充套件類載入器的getparent(),無法獲取引導類載入器;

引導類載入器主要負責載入java的核心類庫,我們無法獲取到

 @Test
    public void test(){
        ClassLoader classLoader = ClassLoadingTest.class.getClassLoader();
        System.out.println(classLoader);

        ClassLoader loaderParent = classLoader.getParent();
        System.out.println(loaderParent);

        ClassLoader parent = loaderParent.getParent();
        System.out.println(parent);
    }

結果展示:

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@54bedef2
null

相關文章