欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中類(lèi)的加載器及其加載過(guò)程

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

Java中類(lèi)的加載器及其加載過(guò)程

概述

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

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

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

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

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

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

所以,類(lèi)的加載過(guò)程如下??

過(guò)程一:Loading

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

Loading過(guò)程:

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

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

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

過(guò)程二:Linking

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

Verify

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

驗(yàn)證有四種形式:

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

e.g.:

class字節(jié)碼文件中以CAFEBABE開(kāi)頭,以供識(shí)別

Prepare

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

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

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

Resolve

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

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

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

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

過(guò)程三:Initialization

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

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

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

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

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

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

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

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

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

虛擬機(jī)必須保證一個(gè)類(lèi)的()方法在多線(xiàn)程下被同步加鎖

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

相關(guān)文章

  • kafka 啟動(dòng)報(bào)錯(cuò) missingTopicsFatal is true的解決

    kafka 啟動(dòng)報(bào)錯(cuò) missingTopicsFatal is true的解決

    這篇文章主要介紹了kafka 啟動(dòng)報(bào)錯(cuò) missingTopicsFatal is true的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot使用hibernate validator校驗(yàn)方式

    springboot使用hibernate validator校驗(yàn)方式

    hibernate validator提供了一套比較完善、便捷的驗(yàn)證實(shí)現(xiàn)方式。下面小編給大家介紹下springboot使用hibernate validator校驗(yàn)方式,感興趣的朋友一起看看吧
    2018-01-01
  • JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能實(shí)例詳解

    JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能實(shí)例詳解

    這篇文章主要介紹了JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-05-05
  • Spring中@Transactional用法詳細(xì)介紹

    Spring中@Transactional用法詳細(xì)介紹

    這篇文章主要介紹了Spring中@Transactional用法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • IDEA中Web項(xiàng)目控制臺(tái)亂碼的問(wèn)題及解決方法

    IDEA中Web項(xiàng)目控制臺(tái)亂碼的問(wèn)題及解決方法

    這篇文章主要介紹了IDEA中Web項(xiàng)目控制臺(tái)亂碼的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • maven多個(gè)plugin相同phase的執(zhí)行順序

    maven多個(gè)plugin相同phase的執(zhí)行順序

    這篇文章主要介紹了maven多個(gè)plugin相同phase的執(zhí)行順序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • java正則表達(dá)式的簡(jiǎn)單運(yùn)用

    java正則表達(dá)式的簡(jiǎn)單運(yùn)用

    這篇文章主要為大家詳細(xì)介紹了java正則表達(dá)式的簡(jiǎn)單運(yùn)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 詳解如何在SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果

    詳解如何在SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果

    在一個(gè)完整的項(xiàng)目中,如果每一個(gè)控制器的方法都返回不同的結(jié)果,那么對(duì)項(xiàng)目的維護(hù)和擴(kuò)展都會(huì)很麻煩。因此,本文為大家準(zhǔn)備了SpringBoot項(xiàng)目中使用統(tǒng)一返回結(jié)果的方法,需要的可以參考一下
    2022-10-10
  • Java設(shè)計(jì)模式之享元模式實(shí)例詳解

    Java設(shè)計(jì)模式之享元模式實(shí)例詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之享元模式,結(jié)合實(shí)例形式詳細(xì)分析了享元模式的概念、功能、定義及使用方法,需要的朋友可以參考下
    2018-04-04
  • Java+MySQL前后端連接新手小白教程

    Java+MySQL前后端連接新手小白教程

    Java作為一種廣泛使用的編程語(yǔ)言之一,在開(kāi)發(fā)Web應(yīng)用程序時(shí)經(jīng)常需要連接MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,下面這篇文章主要給大家介紹了關(guān)于Java+MySQL前后端連接的相關(guān)資料,需要的朋友可以參考下
    2024-03-03

最新評(píng)論