亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java類的加載過程以及類加載器的分析

 更新時間:2018年08月04日 17:41:16   作者:world6  
這篇文章給大家詳細講述了java類的加載過程以及類加載器的相關知識點內(nèi)容,有需要的朋友可以學習下。

我們知道,我們寫的java代碼保存的格式是 .java, java文件被編譯后會轉換為字節(jié)碼,字節(jié)碼可以在任何平臺通過java虛擬機來運行,這也是java能夠跨平臺的原因。

那JVM是如何來讓我們寫的java文件運行的呢? 這個問題通常的問法好像是:類是如何被加載的。

記得第一次遇見這個問題的時候,同學給我的回答是:

1.虛擬機會加載JDK里類的核心包

2.虛擬機會加載JDK里類的擴展包

3.虛擬機會加載JDK里類的系統(tǒng)包

4.虛擬機再會加載我們寫好的java類。

初學的時候,大家都這么說,好像也沒發(fā)現(xiàn)什么錯。 最近在瀏覽一些博客時看到一些更為詳細的講解,如java類加載全過程,該博文有一萬多的點擊,但感覺還是講得不夠詳細,說了類的加載過程有哪些,但沒有詳細的展開,說了一些類初始化的細節(jié)。 在翻讀《深入理解Java虛擬機》209-235頁后,總結了其內(nèi)容,談談自己對該部分的理解吧。

希望大家看了之后更能理解JVM的工作原理和java類的生產(chǎn)過程(類加載的過程);

類從被加載到虛擬機類存中開始,到被卸載出內(nèi)存為止,它的整個生命周期包括

加載 → 驗證 → 準備 → 解析 → 初始化 → 使用 → 卸載 7個部分、

下面我就來詳細的說說每個部分的詳細過程,再補充一下雙親委派模型。

再次之前我想補充一個名詞解釋,類加載器:虛擬機把 實現(xiàn) 類加載階段中的“通過一個類的全限定名來獲取描述此類的二進制字節(jié)流” 這個過程的代碼稱為類加載器

1. 加載

加載只是類加載過程的一個階段而已,但往往被大家弄成了這就是類的加載過程,所以才有了博文開頭時同學給我的那個回答;

希望大家不要混淆出這個很相似的名詞,從而對類加載有所誤讀。

1.JDK在執(zhí)行程序運行命令時會去JRE目錄中找到jvm.dll , 并初始化JVM

這時會產(chǎn)生一個Bootstrap Loader(啟動類加載器)

2.Bootstrap Loader 自動加載 Extended Loader(標準擴展類加載器)

3.Bootstrap Loader 自動加載 AppClass Loader(系統(tǒng)類加載器)

4.最后由 AppClass Loader 加載 我們指定(想要運行)的 java 類

這里可以提一下雙親委派模型加載類的方式:

實現(xiàn)雙親委派的代碼都集中在java.lang.ClassLoader的 loadClass()方法中, 源碼我就不貼出來了;

其源碼大概意思如下:

1.先檢查此類是否被加載過,若沒有加載則調(diào)用父加載器的loadClass()方法,

2.若父加載器為空,則默認使用啟動類加載器作為父加載器,

3.若父類加載失敗,會拋出一個異常,然后再調(diào)用自己的findClass()方法來進行加載;

結合第一步加載可以這么理解,

1.首先要啟動→ 啟動類加載器,這時會調(diào)用啟動類加載器的父加載器,但由于啟動類加載器時所有類的父加載器,
所以其父加載器為空(相當于Object是所有類的父類,這種感腳~),然后它就會調(diào)用自己的findClass方法來自啟動加載 ;

2.標準擴展類加載器啟動時就會借助其父類 啟動類加載器 作為父加載器 來啟動了;

3.系統(tǒng)類加載器啟動時就會借助其父類 標準擴展類加載器 作為父加載器 來啟動了;

4.最后我們編寫的普通類就會借助其父類 系統(tǒng)類加載器 作為父加載器 來啟動了;

2.驗證

驗證主要分為以下幾個步驟:文件格式驗證->元數(shù)據(jù)驗證->字節(jié)碼驗證->符號引用驗證

1.文件格式驗證:主要是檢查字節(jié)碼的字節(jié)流是否符合Class文件格式的規(guī)范,驗證該文件是否能被當前的 jvm 所處理,
如果沒問題,字節(jié)里就可以進入方法區(qū)進行保存了;

2.元數(shù)據(jù)驗證:對字節(jié)碼描述的信息進行語義分析,保證其描述的內(nèi)容符合java語言的語法規(guī)范,能被java虛擬機識別;

3.字節(jié)碼驗證:該部分最為復雜,對方法體內(nèi)的內(nèi)容進行驗證,保證代碼在運行時不會做出什么危害虛擬機安全的事件;

4.符號引用驗證:來驗證一些引用的真實性與可行性,比如代碼里面引了其他類(符號中通過字符串描述的全限定名是否能找到對應的類),這里就要去檢測一下那些來究竟是否存在;或者說代碼中訪問了其他類的一些屬性,這里就對那些屬性的可以訪問行進行了檢驗。(這一步將為后面的解析工作打下基礎)

多說兩句。。。 我覺得這個驗證就是看class文件符不符合 JVM 的胃口 , 如果不符合 JVM 的胃口的話,無法完成加載,說明你寫的代碼 有毒.... 偷笑偷笑

3.準備

準備階段會為類變量(指的是靜態(tài)變量,這就是我們常說的,靜態(tài)變量/方法 在類加載的時候就執(zhí)行了,通過類名.靜態(tài)**來調(diào)用)分配內(nèi)存并設置類的初始值; 值得一提的是 如果有以下語句:

public static int i = 123 ;

在準備階段的初始值是 0 ,而不是 123 , 是因為此時 只是分配內(nèi)存空間而已, 并沒有對 i 進行初始化, 真正的對 i 賦值是在 初始化 階段;

4.解析

1.類或接口的解析;

2.字段解析;

3.類方法解析;

4.接口方法解析;

此部分內(nèi)容涉及 invokedynamic指令,靜態(tài)、動態(tài)語音調(diào)用 不做展開

如果解析到代碼內(nèi)容有問題,解析不通過將會拋出異常!

5.初始化

類初始化階段是類加載過程中的最后一步,這才是執(zhí)行類中定義的java程序代碼(也可以說是字節(jié)碼)。
在準備階段,已經(jīng)為變量賦過一次系統(tǒng)要求的初始值,到了初始化階段會根據(jù)程序員的要求出初始化變量賦值。

Java虛擬機沒有嚴格約束什么時候開始類加載過程的第一階段,但嚴格規(guī)定了有且只有5鐘情況必須立即馬上光速對類進行 初始化

當然加載、驗證、準備需要在次之前,(解析也可以在初始化以后再開始~)

1.遇到new,get static,put static,invoke static這4條字節(jié)碼指令時,假如類還沒進行初始化,則馬上對其進行初始化工作。
也就是三種情況:用new實例化一個對象時、讀取或設置一個雷的靜態(tài)字段時、執(zhí)行靜態(tài)方法時;

2.使用java.lang.reflect.*的方法對類進行反射調(diào)用時,如果類還沒有進行過初始化,立即馬上光速對其進行初始化?。?!

3.初始化一個類的時候,如果其父類還沒有被初始化,那么會先去初始化其父類;

4.當 JVM 啟動時,用戶需要指定一個要執(zhí)行的主類(包含static void main(String 【】args)的那個類),則JVM會先去初始化這個類;

5.當使用JDK1.7 的動態(tài)語言支持時,如果一個java.lang.invoke.MethodHandle實力最后的解析結果為 get static,put static,invoke static 的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則需要先初始化;

小結:

介紹了類加載過程的 加載、驗證、準備、解析、初始化、等5個階段,以及虛擬機進行了哪些動作,簡單敘述了類加載器的工作原理,如果有說得不妥當?shù)牡胤剑€以請大家批評指正,多多交流。

相關文章

  • SpringMVC配置多個properties文件之通配符解析

    SpringMVC配置多個properties文件之通配符解析

    這篇文章主要介紹了SpringMVC配置多個properties文件之通配符解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot中集成screw(螺絲釘)實現(xiàn)數(shù)據(jù)庫表結構文檔生成方法

    SpringBoot中集成screw(螺絲釘)實現(xiàn)數(shù)據(jù)庫表結構文檔生成方法

    這篇文章主要介紹了SpringBoot中集成screw(螺絲釘)實現(xiàn)數(shù)據(jù)庫表結構文檔生成,下面以連接mysql數(shù)據(jù)庫并生成html格式的數(shù)據(jù)庫結構文檔為例,插件的使用方式除可以使用代碼外,還可以使用Maven插件的方式,需要的朋友可以參考下
    2024-07-07
  • Springboot實現(xiàn)給前端返回一個tree結構方法

    Springboot實現(xiàn)給前端返回一個tree結構方法

    這篇文章主要介紹了SpringBoot返回給前端一個tree結構的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Spring Boot 中PageHelper 插件使用配置思路詳解

    Spring Boot 中PageHelper 插件使用配置思路詳解

    這篇文章主要介紹了Spring Boot 中PageHelper 插件使用配置及實現(xiàn)思路,通過引入myabtis和pagehelper依賴,在yml中配置mybatis掃描和實體類,具體實現(xiàn)方法跟隨小編一起看看吧
    2021-08-08
  • Java實現(xiàn)導入導出Excel文件的方法(poi,jxl)

    Java實現(xiàn)導入導出Excel文件的方法(poi,jxl)

    這篇文章主要介紹了Java實現(xiàn)導入導出Excel文件的方法(poi,jxl),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Maven使用方法詳及方式詳細介紹

    Maven使用方法詳及方式詳細介紹

    使用maven倉庫的話需要從網(wǎng)上下載maven的包,比如“apache-maven-3.5.4-bin.tar”,下載完成之后解壓,在解壓的文件夾中的conf目錄下的settings.xml文件夾下就可以配置maven遠程倉庫和本地倉庫的地址
    2022-11-11
  • 淺談Java的虛擬機結構以及虛擬機內(nèi)存的優(yōu)化

    淺談Java的虛擬機結構以及虛擬機內(nèi)存的優(yōu)化

    這篇文章主要介紹了Java的虛擬機結構以及虛擬機內(nèi)存的優(yōu)化,講到了JVM的堆和??臻g及GC垃圾回收等重要知識,需要的朋友可以參考下
    2016-03-03
  • springboot接收http請求,解決參數(shù)中+號變成空格的問題

    springboot接收http請求,解決參數(shù)中+號變成空格的問題

    這篇文章主要介紹了springboot接收http請求,解決參數(shù)中+號變成空格的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 修改maven項目端口號的方法

    修改maven項目端口號的方法

    今天小編就為大家分享一篇修改maven項目端口號的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Mybatis超級強大的動態(tài)SQL語句大全

    Mybatis超級強大的動態(tài)SQL語句大全

    MyBatis的動態(tài)SQL是基于OGNL表達式的,它可以幫助我們方便的在SQL語句中實現(xiàn)某些邏輯,下面這篇文章主要給大家介紹了關于Mybatis超級強大的動態(tài)SQL語句的相關資料,需要的朋友可以參考下
    2022-05-05

最新評論