當(dāng)前位置:首頁(yè)>職場(chǎng)>jvm面試題常量池(JVM如何加載.class文件的)
發(fā)布時(shí)間:2024-01-24閱讀(17)

ClassLoader就是類加載器,是Java中的核心組件。類加載器主要工作在類加載中的加載過程,它所負(fù)責(zé)的任務(wù)就是,根據(jù)類的全限定名獲取定義該類的二進(jìn)制字節(jié)流,這個(gè)獲取方法在虛擬機(jī)規(guī)范并沒有要求,既可以從jar包,war包中讀取,也可以從網(wǎng)絡(luò)中獲取,或者是由JSP文件生成。類加載器將該字節(jié)流轉(zhuǎn)化為具體的類對(duì)象,存放在JVM的方法區(qū)中,作為該類的訪問入口。
除此之外,ClassLoader還與兩個(gè)類的“相等”有關(guān)。兩個(gè)類相等的其中一個(gè)必要條件就是加載它們的類加載器一定要是同一個(gè),換句話來說,即使兩個(gè)類出自同一個(gè)class文件,如果是經(jīng)過不同的類加載進(jìn)行加載,在JVM中也不是相等的兩個(gè)類。所以這也正是雙親委派模型的一個(gè)重要意義。
從開發(fā)者角度來看,ClassLoader有四種:
1.啟動(dòng)類加載器啟動(dòng)類加載器 BootStrapClassLoader:它是所有類加載器的祖先,也就是雙親委派模型下的頂層。它的責(zé)任是負(fù)責(zé)加載<JAVA_HOME>/lib目錄下的核心類庫(kù),比如說像Object,System這樣的類都是由啟動(dòng)類加載器來進(jìn)行加載的。并且,它是根據(jù)文件名來判斷合法性的,也就是說,即使我們將一個(gè)不符合規(guī)范的類庫(kù)放進(jìn)目錄里,也是不會(huì)被加載的。那啟動(dòng)類加載器是由JVM中的C 來實(shí)現(xiàn)的,所以在Java語言中是無法直接調(diào)用的。
2.擴(kuò)展類加載器擴(kuò)展類加載器 :在雙親委派模型下,它是啟動(dòng)類加載器的子加載器,而在Java中,它的父加載器顯示為null,沒錯(cuò),正是因?yàn)閱?dòng)類加載器是C 實(shí)現(xiàn)的,所以在Java中理所應(yīng)當(dāng)是null。它所負(fù)責(zé)的就是加載<JAVA_HOME>/lib/ext目錄下的class文件或者jar包。并且是由Java實(shí)現(xiàn)的,所以可以在Java中進(jìn)行調(diào)用。我們也可以把自己實(shí)現(xiàn)的jar包放在對(duì)應(yīng)的目錄下讓擴(kuò)展類加載器進(jìn)行加載,實(shí)現(xiàn)對(duì)核心類庫(kù)的擴(kuò)展。
3.應(yīng)用類加載器:應(yīng)用類加載器:主要負(fù)責(zé)加載ClassPath下也就是工程目錄下的class文件和jar包。所以我們平時(shí)寫的自定義類默認(rèn)都是通過應(yīng)用類加載器來進(jìn)行加載的。
4.自定義類加載器自定義類加載器:除了使用默認(rèn)的這三種,我們還可以自定義類加載器。一般的做法就是繼承ClassLoader抽象類,然后重寫findClass方法,在里面加載好對(duì)應(yīng)的字節(jié)數(shù)組,然后作為參數(shù)傳給defineClass方法,完成真正的類加載。
歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-238147.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號(hào)-5 TXT地圖HTML地圖XML地圖