在上一篇中,有少少的介紹了一下類通過反射的一個載入過程,作為一個開發Java的媛,對於類載入機制還是要有些瞭解的,先問幾個問題:
Java中載入類的工作誰來做。 載入過程包括什麼。 類能載入,那對象呢。 1、Java中載入類的工作誰來做。
Java虛擬機器,將靜態位元組碼檔案.class載入到記憶體中。 2、載入過程包括什麼。
類的載入過程,也可以稱為類的生命週期,包括載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。其中準備、驗證、解析3個部分統稱為串連(Linking)。
載入:載入.class檔案進記憶體,擷取定義 此類的二進位位元組流,在方法區建立Class對象。
串連(驗證、準備、解析): 驗證【重要,但不必須】:保證.class檔案中內容符合當前虛擬機器的要求,主要的幾個驗證封裝括(檔案格式驗證、中繼資料驗證、位元組碼驗證、符號引用驗證) 準備:正式為類變數(static)分配記憶體並設定類變數初始值的階段。 例子: public static int value=1,初始值為0值; 因為這時候尚未開始執行任何java方法,而把value賦值為1的put static指令是程式被編譯後,存放於類構造器()方法之中; 所以把value賦值為1的動作將在初始化階段才會執行; 但是如果是用final修飾的,準備階段的初始值就是1了,因為這個變數會變為常量。 解析:虛擬機器將常量池內的符號引用替換為直接引用的過程。
初始化:編譯器自動收集類中的所有類變數的賦值動作和靜態語句塊static{}中的語句合并產生的,也就是在準備階段後,真正的對靜態變數賦值。
初始化的觸發條件。
(1) 建立類的執行個體,也就是new的方式
(2) 訪問某個類或介面的靜態變數,或者對該靜態變數賦值
(3) 調用類的靜態方法
(4) 反射(如Class.forName(“com.shengsiyuan.Test”))
(5) 初始化某個類的子類,則其父類也會被初始化
(6) Java虛擬機器啟動時被標明為啟動類的類(Java Test),直接使用java.exe命令來運行某個主類
3、類能載入,那對象呢。
對象是根據類建立出來的,所以對象的生命週期就是包含在類的生命週期中:
對象的建立到回收是在類的使用過程中進行的
總結:類的載入過程就是把硬碟中編譯好的位元組碼檔案,載入到記憶體中,並且給類變數賦值的一個過程到類被使用再到類從記憶體中被卸載的一個過程。
Reference
https://blog.csdn.net/lixingtao0520/article/details/72927775
Tips:
需要的提前瞭解一下JVM記憶體模型、Java.lang.*中的一些類及方法,例如ClassLoader。