摘要:擴(kuò)展類(lèi)加載器這個(gè)類(lèi)加載器負(fù)責(zé)加載目錄中的。應(yīng)用程序類(lèi)加載器這個(gè)類(lèi)加載器負(fù)責(zé)加載用戶(hù)類(lèi)路徑上所指定的類(lèi)庫(kù)。例如,它存放在中,無(wú)論哪個(gè)類(lèi)加載器進(jìn)行加載最終都會(huì)委派給頂層啟動(dòng)類(lèi)加載器進(jìn)行加載,因此類(lèi)在程序的各種類(lèi)加載器中都是同一個(gè)類(lèi)。
類(lèi)加載過(guò)程
1、加載
2、驗(yàn)證
3、準(zhǔn)備
4、解析
5、初始化
雙親委派模型
從Java虛擬機(jī)的角度來(lái)講,只存在兩種不同的類(lèi)加載器:一種是啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader),這個(gè)類(lèi)加載器使用c++語(yǔ)言實(shí)現(xiàn),是虛擬機(jī)自身的一部分;另一種就是所有其他的類(lèi)加載器,這些類(lèi)加載器都由Java語(yǔ)言實(shí)現(xiàn),獨(dú)立于虛擬機(jī)外部,并且全部都繼承自抽象類(lèi)java.lang.ClassLoader
雙親委派模型
1、啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader):這個(gè)類(lèi)加載器負(fù)責(zé)加載
2、擴(kuò)展類(lèi)加載器(Extension ClassLoader):這個(gè)類(lèi)加載器負(fù)責(zé)加載
3、應(yīng)用程序類(lèi)加載器(Application ClassLoader):這個(gè)類(lèi)加載器負(fù)責(zé)加載用戶(hù)類(lèi)路徑上所指定的類(lèi)庫(kù)。
雙親委派模型的工作過(guò)程:
如果一個(gè)類(lèi)加載器收到類(lèi)加載請(qǐng)求,首先它不會(huì)自己嘗試去加載這個(gè)類(lèi),而是把加載請(qǐng)求委派給父類(lèi)加載器去完成,每一個(gè)層次的類(lèi)加載器都是如此,無(wú)論哪一個(gè)類(lèi)加載器請(qǐng)求加載最終都會(huì)委派給最頂層的啟動(dòng)類(lèi)加載器進(jìn)行加載。只有當(dāng)父類(lèi)加載器反饋?zhàn)约簾o(wú)法完成加載時(shí),子類(lèi)才會(huì)嘗試自己去加載。
這樣有一個(gè)顯而易見(jiàn)的好處就是Java類(lèi)隨著它的類(lèi)加載器一起具備了一種有優(yōu)先級(jí)的層次關(guān)系。例如java.lang.Object,它存放在rt.jar中,無(wú)論哪個(gè)類(lèi)加載器進(jìn)行加載最終都會(huì)委派給頂層啟動(dòng)類(lèi)加載器進(jìn)行加載,因此Object類(lèi)在程序的各種類(lèi)加載器中都是同一個(gè)類(lèi)。
歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67956.html
摘要:如果需要支持類(lèi)的動(dòng)態(tài)加載或需要對(duì)編譯后的字節(jié)碼文件進(jìn)行解密操作等,就需要與類(lèi)加載器打交道了。雙親委派模型,雙親委派模型,約定類(lèi)加載器的加載機(jī)制。任何之類(lèi)的字節(jié)碼都無(wú)法調(diào)用方法,因?yàn)樵摲椒ㄖ荒茉陬?lèi)加載的過(guò)程中由調(diào)用。 jvm系列 垃圾回收基礎(chǔ) JVM的編譯策略 GC的三大基礎(chǔ)算法 GC的三大高級(jí)算法 GC策略的評(píng)價(jià)指標(biāo) JVM信息查看 GC通用日志解讀 jvm的card table數(shù)據(jù)...
摘要:前面提到,對(duì)于數(shù)組類(lèi)來(lái)說(shuō),它并沒(méi)有對(duì)應(yīng)的字節(jié)流,而是由虛擬機(jī)直接生成的。對(duì)于其他的類(lèi)來(lái)說(shuō),虛擬機(jī)則需要借助類(lèi)加載器來(lái)完成查找字節(jié)流的過(guò)程。驗(yàn)證階段的目的,在于確保被加載類(lèi)能夠滿(mǎn)足虛擬機(jī)的約束條件。 Java 虛擬機(jī)將字節(jié)流轉(zhuǎn)化為 Java 類(lèi)的過(guò)程。這個(gè)過(guò)程可分為加載、鏈接以及初始化 三大步驟。 加載是指查找字節(jié)流,并且據(jù)此創(chuàng)建類(lèi)的過(guò)程。加載需要借助類(lèi)加載器,在 Java 虛擬機(jī)中,類(lèi)...
摘要:當(dāng)前類(lèi)加載器和所有父類(lèi)加載器都無(wú)法加載該類(lèi)時(shí),拋出異常。加載兩份相同的對(duì)象的情況和不屬于父子類(lèi)加載器關(guān)系,并且各自都加載了同一個(gè)類(lèi)。類(lèi)加載機(jī)制與接口當(dāng)虛擬機(jī)初始化一個(gè)類(lèi)時(shí),不會(huì)初始化該類(lèi)實(shí)現(xiàn)的接口。 類(lèi)加載機(jī)制 概念 類(lèi)加載器把class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,存放在方法區(qū),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象,用來(lái)封裝類(lèi)在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。 1、加載: 查...
摘要:當(dāng)程序使用某個(gè)類(lèi)時(shí),如果該類(lèi)還沒(méi)被初始化,加載到內(nèi)存中,則系統(tǒng)會(huì)通過(guò)加載連接初始化三個(gè)過(guò)程來(lái)對(duì)該類(lèi)進(jìn)行初始化。一旦一個(gè)類(lèi)被加載到中之后,就不會(huì)再次載入了。它既可以從本地文件系統(tǒng)獲取二進(jìn)制文件來(lái)加載類(lèi),也可以遠(yuǎn)程主機(jī)獲取二進(jìn)制文件來(lái)加載類(lèi)。 當(dāng)程序使用某個(gè)類(lèi)時(shí),如果該類(lèi)還沒(méi)被初始化,加載到內(nèi)存中,則系統(tǒng)會(huì)通過(guò)加載、連接、初始化三個(gè)過(guò)程來(lái)對(duì)該類(lèi)進(jìn)行初始化。該過(guò)程就被稱(chēng)為類(lèi)的初始化 類(lèi)加載 ...
摘要:學(xué)習(xí)能更深入的理解這門(mén)語(yǔ)言,能理解語(yǔ)言底層的執(zhí)行過(guò)程,深入到字節(jié)碼層次。 目錄 ? 前言 程序的運(yùn)行 1.JVM類(lèi)加載機(jī)制 ①一般在什么情況下會(huì)去加載一個(gè)類(lèi)?也就是說(shuō),什么時(shí)候.class字節(jié)碼文件中加載這個(gè)類(lèi)到JVM內(nèi)存里來(lái)? ②驗(yàn)證、準(zhǔn)備、初始化 ③初始化 2.類(lèi)加載器和雙親委派機(jī)制 ...
摘要:以上文中的類(lèi)的加載過(guò)程為例,它的加載器為系統(tǒng)類(lèi)加載器。自定義加載器編寫(xiě)自定義加載器并不困難,只要繼承抽象類(lèi)并覆蓋方法就行了。源碼來(lái)自參考資料類(lèi)加載機(jī)制與類(lèi)加載器架構(gòu)深入探討類(lèi)加載器 序 我是在關(guān)于Java的面試題里了解到類(lèi)加載器的,在這之前從未想過(guò)Java里類(lèi)是如何被加載、解析的,一直以為只要Import就好了。事實(shí)上Java類(lèi)加載器是一塊非常重要的內(nèi)容,可以用在類(lèi)層次劃分、OSGi、...
閱讀 2555·2021-09-30 10:00
閱讀 3491·2021-09-22 10:54
閱讀 6212·2021-09-07 10:28
閱讀 2943·2019-08-29 13:53
閱讀 742·2019-08-29 12:42
閱讀 958·2019-08-26 13:51
閱讀 1258·2019-08-26 13:32
閱讀 3021·2019-08-26 10:39