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