最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中類的加載器及其加載過程

 更新時間:2023年04月19日 09:17:07   作者:何小幸  
字節(jié)碼文件在類加載器子系統(tǒng)中要進(jìn)行加載、鏈接、初始化等處理,我們這里詳細(xì)來談其中過程,本文主要介紹了Java中類的加載器及其加載過程,感興趣的同學(xué)可以參考一下

Java中類的加載器及其加載過程

概述

字節(jié)碼文件在類加載器子系統(tǒng)中要進(jìn)行加載、鏈接、初始化等處理,我們這里詳細(xì)來談其中過程

類加載器子系統(tǒng)負(fù)責(zé)從文件系統(tǒng)或網(wǎng)絡(luò)中加載Class文件,且ClassLoader只負(fù)責(zé)class文件的加載,至于其能否運(yùn)行,則交由ExecutionEngine來判斷。

加載的類信息存放于一塊稱為方法區(qū)的內(nèi)存空間。除了類的信息以外,方法區(qū)中還會存放運(yùn)行時常量池信息,可能還包括字符串字面量和數(shù)字常量(這部分常量信息是Class文件中常量池部分的內(nèi)存映射)

??class文件最終加載到JVM中,根據(jù)這個文件可以實例化出n個一模一樣的實例,加載到JVM的class文件則被稱為DNA元數(shù)據(jù)模板,放在方法區(qū)。而在這整個文件到元數(shù)據(jù)模板的過程中,類裝載器就起到了一個轉(zhuǎn)換器的作用

轉(zhuǎn)換和執(zhí)行過程:

首先需要裝載目標(biāo)類,再進(jìn)行鏈接,然后對其進(jìn)行初始化,最終調(diào)用對應(yīng)類中的方法

所以,類的加載過程如下??

過程一:Loading

這個過程也稱為加載,但和類的加載不同,這個加載只是其中的一個環(huán)節(jié),切莫搞混,我們這里用Loading來代替,以防混淆

Loading過程:

  • 通過一個類的全限定名獲取定義此類的二進(jìn)制字節(jié)流
  • 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法去的運(yùn)行時數(shù)據(jù)結(jié)構(gòu)
  • 再內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口

加載.class文件的幾種方式:

  • 從本地系統(tǒng)中直接加載
  • 通過系統(tǒng)網(wǎng)絡(luò)獲取,典型場景:Web Applet
  • 從zip壓縮包中獲取,成為日后jar、war格式的基礎(chǔ)
  • 運(yùn)行時計算生成,使用最多的是:動態(tài)代理技術(shù)
  • 由其他文件生成,典型場景:JSP應(yīng)用
  • 從專有數(shù)據(jù)庫中提取.class文件,比較少見
  • 從加密文件中獲取

過程二:Linking

鏈接階段包括驗證(Verify)、準(zhǔn)備(Prepare)、解析(Resolve)

Verify

目的在于確保Class文件的字節(jié)流中包含信息符合當(dāng)前虛擬機(jī)要求,保證被加載類的正確性,不會威脅虛擬機(jī)自身的安全。

驗證有四種形式:

  • 文件格式驗證
  • 元數(shù)據(jù)驗證
  • 字節(jié)碼驗證
  • 符號引用驗證

e.g.:

class字節(jié)碼文件中以CAFEBABE開頭,以供識別

Prepare

該階段為類的變量分配內(nèi)存表并且設(shè)置該變量的默認(rèn)初始值,即零值。

不包含用final修飾的static,因為final在編譯的時候就會分配了,準(zhǔn)備階段會進(jìn)行顯式初始化

同樣也不會為實例變量分配初始化,類變量會分配在方法區(qū)中,但實例變量會隨著對象一起分配到j(luò)ava堆

Resolve

該階段將常量池內(nèi)的符號引用轉(zhuǎn)換為直接引用的過程

事實上,解析操作往往會伴隨著JVM在執(zhí)行完初始化之后再執(zhí)行

符號引用就是一組符號來描述所引用的目標(biāo),符號引用的字面量形式明確定義在《java虛擬機(jī)規(guī)范》的class文件格式中。直接引用就是直接指向目標(biāo)的指針、相對偏移量或一個間接定位到目標(biāo)的句柄

解析動作主要針對類或接口、字段、類方法、接口方法、方法類型等。對應(yīng)常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等

過程三:Initialization

該過程是執(zhí)行類構(gòu)造器方法()的過程

此方法不需定義,是javac虛擬機(jī)自動收集類中的所有類變量的賦值動作靜態(tài)代碼塊中的語句合并而來,所以如果沒有這兩項操作,就不存在這個過程。

這里會出現(xiàn)一個神奇的現(xiàn)象:

static{
    number = 20;
}
private static int number = 10;

這樣也可以執(zhí)行,而執(zhí)行結(jié)果為10,究其原因,number在prepare中早已初始化,并賦值為0,而來到Initialization階段中才會開始進(jìn)行賦值,首先執(zhí)行static塊中的number = 20,后再執(zhí)行number = 10的賦值操作,最后結(jié)果為10。

*但在static中不能對其進(jìn)行引用/調(diào)用,比如打印操作,會報錯:Illegal forward reference*

構(gòu)造器方法中指令按語句在源文件中出現(xiàn)的順序執(zhí)行

()不同于類的構(gòu)造器(關(guān)聯(lián):構(gòu)造器是虛擬機(jī)視角下的())

若該類具有父類,JVM會保證子類的()執(zhí)行前,父類的()已經(jīng)執(zhí)行完畢

虛擬機(jī)必須保證一個類的()方法在多線程下被同步加鎖

到此這篇關(guān)于Java中類的加載器及其加載過程的文章就介紹到這了,更多相關(guān)Java類加載器及過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于mybatis傳入?yún)?shù)一直為null的問題

    關(guān)于mybatis傳入?yún)?shù)一直為null的問題

    這篇文章主要介紹了關(guān)于mybatis傳入?yún)?shù)一直為null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java后端Cookie實現(xiàn)(時間戳)代碼實例

    Java后端Cookie實現(xiàn)(時間戳)代碼實例

    這篇文章主要介紹了Java后端Cookie實現(xiàn)(時間戳)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • Springboot如何設(shè)置靜態(tài)資源緩存一年

    Springboot如何設(shè)置靜態(tài)資源緩存一年

    這篇文章主要介紹了Springboot如何設(shè)置靜態(tài)資源緩存一年,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • java數(shù)據(jù)結(jié)構(gòu)與算法之中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式的方法

    java數(shù)據(jù)結(jié)構(gòu)與算法之中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式的方法

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式的方法,簡單分析了java中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式的相關(guān)實現(xiàn)方法與技巧,需要的朋友可以參考下
    2016-08-08
  • 帶你了解Java中的異常處理(下)

    帶你了解Java中的異常處理(下)

    這篇文章主要介紹了Java中的異常處理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • Mybatis中流式查詢的實現(xiàn)示例

    Mybatis中流式查詢的實現(xiàn)示例

    MyBatis的ResultHandler是用于處理數(shù)據(jù)庫查詢結(jié)果集的工具,可以通過回調(diào)函數(shù)對數(shù)據(jù)進(jìn)行流式處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • JAVA對象中使用?static?和?String?基礎(chǔ)探究

    JAVA對象中使用?static?和?String?基礎(chǔ)探究

    這篇文章主要介紹了JAVA對象中使用static和String基礎(chǔ)探究,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java中詳細(xì)解析Map接口

    Java中詳細(xì)解析Map接口

    這篇文章主要介紹了Java8 中 Map 接口的新方法,本文通過代碼實例給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 詳解Quartz 與 Spring框架集成的三種方式

    詳解Quartz 與 Spring框架集成的三種方式

    這篇文章主要介紹了詳解Quartz 與 Spring框架集成的三種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Maven編譯Fatal?error?compiling:無效的目標(biāo)發(fā)行版:11問題及解決

    Maven編譯Fatal?error?compiling:無效的目標(biāo)發(fā)行版:11問題及解決

    在Java11中編譯Springboot工程時遇到問題,解決方法是在pom.xml文件中指定Maven的Java編譯器版本,可以使用MavenJava編譯器屬性或插件,在Java9及以后的版本中,也要使用插件并設(shè)置release屬性
    2024-12-12

最新評論

湖南省| 彭阳县| 依安县| 大丰市| 松滋市| 金塔县| 三明市| 诸城市| 迭部县| 芮城县| 宜良县| 德阳市| 高邮市| 吴江市| 文水县| 临西县| 红河县| 龙川县| 南汇区| 玉龙| 茶陵县| 乐业县| 金湖县| 龙江县| 容城县| 宣化县| 巴马| 利川市| 景洪市| 荥经县| 沁水县| 贵南县| 三穗县| 贞丰县| 宣城市| 三都| 株洲县| 郁南县| 佛坪县| 承德市| 沁水县|