Java類加載基本過程詳細(xì)介紹
Java類加載基本過程詳細(xì)介紹
基本過程:
- 根據(jù)類的全限定名稱加載定義類的二進(jìn)制字節(jié)流。
- 將字節(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ì)象,作為方法去這個(gè)類的各種數(shù)據(jù)訪問入口
數(shù)組類本身不通過類加載器創(chuàng)建,由java虛擬機(jī)直接創(chuàng)建,數(shù)組類的元素類型由類加載器加載。
數(shù)組類的元素類型:數(shù)組去掉所有維度后的類型,
文件格式驗(yàn)證:
- 0xCAFEBABY 魔數(shù)開頭;
- 主次版本號(hào)當(dāng)前虛擬機(jī)可處理;
- 常量類型;
- 索引執(zhí)行類型;
- utf8編碼數(shù)據(jù)類型,
元數(shù)據(jù)驗(yàn)證:字節(jié)碼描述信息語義分析:
- 是否有父類;
- 父類是否繼承了final修飾的類;
- 非抽型類是否實(shí)現(xiàn)了父類或接口中需要實(shí)現(xiàn)的方法;
- 類中的字段、方法的覆蓋,重載矛盾;
字節(jié)碼驗(yàn)證:通過語義流及控制流分析確定程序予以的合法性,正確性,方法體分析驗(yàn)證。
- 符號(hào)引用驗(yàn)證:虛擬機(jī)將符號(hào)引用轉(zhuǎn)化為直接引用時(shí)候,解析階段,對(duì)類自身以外信息進(jìn)行匹配性驗(yàn)證
- 符號(hào)引用中通過字符描述的全限定名是否能找到對(duì)應(yīng)的類;
- 指定類中是否存在符合方法字段的描述符,及簡(jiǎn)單名稱所描述的方法和字段;
- 符號(hào)引用中類,字段,方法的訪問性。
準(zhǔn)備:在方法區(qū)中為類變量分配內(nèi)存及設(shè)置類變量初始值。
- 初始值通常為數(shù)據(jù)類型的零值,final修飾的值直接初始化為相應(yīng)值。
- 類變量為static修飾的變量,區(qū)分于實(shí)例變量。
解析:虛擬機(jī)將常量池中的符號(hào)引用替換為直接引用過程
CONSTANT_Class_info,CONSTANT_Fieldref_info,CONSTANT_Methodref_info..
- 符號(hào)引用:以一組符號(hào)來描述所引用的目標(biāo),任何形式的字面量,只要使用時(shí)能無歧義的定位到目標(biāo),,與虛擬機(jī)內(nèi)存實(shí)現(xiàn)無關(guān),無關(guān)引用目標(biāo)是否加載。
- 直接引用:直接指向目標(biāo)的指針,偏移量或間接定位到目標(biāo)的句柄,和虛擬機(jī)實(shí)現(xiàn)的內(nèi)存相關(guān),直接引用相關(guān)的目標(biāo)對(duì)象必須已加載。
- 。。。
初始化:開始執(zhí)行類定義中的Java程序代碼。執(zhí)行類構(gòu)造器<cinit>()方法,
<cinit>():
- 編譯器根據(jù)類文件中定義順序自動(dòng)收集類中的類變量的賦值動(dòng)作和靜態(tài)語句塊兒的語句合并產(chǎn)生,靜態(tài)語句塊兒只能訪問到其前定義的變量。
- 區(qū)別于類的構(gòu)造方法,不需要顯示的調(diào)用父類構(gòu)造器,虛擬機(jī)保證子類的<cinit>()執(zhí)行之前父類的<cinit>()已經(jīng)執(zhí)行完成。
- 父類中的靜態(tài)語句塊兒執(zhí)行于前。
- <cinit>()對(duì)于類或接口不是必須的,如果沒有變量賦值操作或靜態(tài)語句塊兒,則不生成。
- 接口的<cinit>()不需要先執(zhí)行父接口的<cinit>(),同樣接口的實(shí)現(xiàn)類<cinit>()也不需要。
- 線程安全:虛擬機(jī)保證多線程環(huán)境中<cinit>()正確的加鎖,同步,同一時(shí)間只能有一個(gè)線程訪問初始化類的<cinit>()
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Spring?Boot面試必問之啟動(dòng)流程知識(shí)點(diǎn)詳解
SpringBoot是Spring開源組織下的子項(xiàng)目,是Spring組件一站式解決方案,主要是簡(jiǎn)化了使用Spring的難度,簡(jiǎn)省了繁重的配置,提供了各種啟動(dòng)器,開發(fā)者能快速上手,這篇文章主要給大家介紹了關(guān)于Spring?Boot面試必問之啟動(dòng)流程知識(shí)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-06-06
Java實(shí)現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a
在圖論中,拓?fù)渑判颍═opological Sorting)是一個(gè)有向無環(huán)圖(DAG, Directed Acyclic Graph)的所有頂點(diǎn)的線性序列。本文將為大家講講拓?fù)渑判蛩惴ǖ脑砑皩?shí)現(xiàn),需要的可以參考一下2022-07-07
Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決
這篇文章主要介紹了Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot創(chuàng)建監(jiān)聽器的方法示例
在Java中,監(jiān)聽器(Listener)是一種設(shè)計(jì)模式,它允許對(duì)象在 特定事件 發(fā)生時(shí) 自動(dòng)執(zhí)行某些操作,這種設(shè)計(jì)模式通常用于實(shí)現(xiàn) 發(fā)布-訂閱模型,本文給大家介紹了SpringBoot創(chuàng)建監(jiān)聽器的方法示例,感興趣的通過可以參考一下2024-04-04

