1. 程式人生 > >java中的類載入機制

java中的類載入機制

今天看了許多大牛的解釋,現在來做個總結:


類的載入機制過程是指由jvm的類載入器載入class位元組碼檔案進入記憶體的過程;(暫且這樣理解)

類載入器可以分為引導類載入器,擴充套件類載入器,系統類載入器;有些地方又可以這樣分:啟動類載入器,自定義載入器。

類載入機制過程:

載入–>驗證–準備–解析—>初始化

這裡寫圖片描述

class位元組碼檔案被載入到jvm記憶體模型中的方法區中。

載入:找到class位元組碼檔案。

驗證:驗證位元組碼的安全性,檢查位元組碼中是否有惡意程式碼等,因為jvm是獨立於編譯器的,不是每個位元組碼檔案都有編譯器進行編譯檢查錯誤,防止有些人新增惡意程式碼破壞。這個過程是非常重要的。

準備:驗證之後,後續的準備,解析都在記憶體中進行了。此過程分配記憶體空間,進行預設的賦值,但這並不是初始化,比如:

public static int a = 8;
定義了靜態成員變數,但是在準備階段,這裡只是預設給a = 0;的預設操作,到了初始化階段才進行 static{}程式碼塊和靜態成員變數的賦值操作,即初始化之後,a = 8。

但是注意,靜態常量在準備階段也給了預設值,該靜態常量的值,給了一個常量符號,但到了解析階段,該常量符號的值,就給了靜態常量,所以靜態常量的賦值是在解析階段就完成好的,沒有觸發初始化。

解析:把相應的符號引用進行替換

初始化:執行static{}程式碼塊,靜態成員變數的賦值操作,該過程是順序進行的,所以這個類載入機制下,出現一個新入門的人看不懂的現象:

static{
a = 90;
}
public static int a = 89;
該過程是這樣執行的:
準備階段,進行靜態成員變數a 的預設賦值0,所以靜態程式碼塊中是可以對前面沒有定義a 進行賦值操作的。然後進行初始化操作,順序執行,最後 a=89;
這裡寫圖片描述

觸發初始化的操作:

  • new 操作
  • 直接呼叫類
  • 反射操作
    呼叫靜態成員常量是不觸發初始化操作的。

今天暫且寫到這,以上內容有很多都是看其他大牛的。有錯誤的請指正。