一酥夭、概述
在開發(fā)Java程序的過程中轻黑,作為開發(fā)者你是否想過我們寫的.java代碼是如何運(yùn)行起來(lái)的呢?其實(shí)這里就涉及到了類的加載流程助泽,即類是如何被加載的啰扛。
首先我們用到的開發(fā)工具比如idea,寫的java代碼都是.java結(jié)尾的文件嗡贺,類的加載首先由編譯器將這個(gè).java編譯成.class字節(jié)碼文件隐解,然后再進(jìn)入正式加載的流程,類的加載流程工分為以下三大階段诫睬。
- 加載
- 鏈接
-驗(yàn)證
-準(zhǔn)備
-解析 - 初始化
接下來(lái)我們根據(jù)這個(gè)加載的流程一個(gè)一個(gè)來(lái)講解煞茫。
二、加載
將class文件加載到j(luò)ava虛擬機(jī)摄凡。
- 通過一個(gè)類的全限定名獲取定義此類的二進(jìn)制字節(jié)流续徽。
- 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
- 在內(nèi)存中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象亲澡,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口钦扭。
三、驗(yàn)證
驗(yàn)證的目的就在于確保Class文件中包含的信息符合當(dāng)前虛擬機(jī)的要求床绪,保證被加載類的正確性客情,安全性。
驗(yàn)證包括四種驗(yàn)證:
- 文件格式驗(yàn)證
- 元數(shù)據(jù)驗(yàn)證
- 字節(jié)碼驗(yàn)證
- 符號(hào)引用驗(yàn)證
四癞己、準(zhǔn)備
為類的static變量分配內(nèi)存膀斋,并設(shè)置該變量的默認(rèn)初始值,即零值末秃。
其中不包含final修飾的static,因?yàn)閒inal在編譯的時(shí)候就會(huì)分配了籽御,準(zhǔn)備階段會(huì)顯式初始化练慕。
不會(huì)為實(shí)例變量分配和初始化惰匙,類變量會(huì)分配在方法區(qū)中,而實(shí)例變量式隨著對(duì)象一起分配到堆內(nèi)存铃将。
五项鬼、解析
將常量池內(nèi)的符號(hào)引用轉(zhuǎn)換為直接引用。
符號(hào)引用:符號(hào)引用就是一組符號(hào)來(lái)描述所引用的目標(biāo)劲阎。
直接引用:直接引用就是直接指向目標(biāo)的指針绘盟,相對(duì)偏移量或一個(gè)間接定位到目標(biāo)的句柄。
解析的對(duì)象主要包括:
- 類/接口
- 字段
- 類方法
- 接口方法
- 方法類型
- 方法句柄
六悯仙、初始化
初始化類變量或靜態(tài)語(yǔ)句龄毡。
初始化階段就是執(zhí)行類構(gòu)造器方法<clinit>()的過程。
此方法是由javac編譯器自動(dòng)收集類中的類變量的賦值動(dòng)作和靜態(tài)代碼塊中的語(yǔ)句合并而來(lái)锡垄。且按照源文件中定義的順序執(zhí)行沦零。
子類的<clinit>()執(zhí)行前,父類的<clinit>()一定會(huì)先執(zhí)行货岭。