您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Java類加載過程與類加載器是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java類加載過程與類加載器是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
通過類的全限定名(包名 + 類名),獲取到類的.class
文件,加載到元空間。
驗(yàn)證:檢驗(yàn).class
文件的安全性
準(zhǔn)備:為靜態(tài)類型變量分配內(nèi)存并設(shè)置默認(rèn)值
解析:將常量池內(nèi)的符號(hào)引用轉(zhuǎn)換為直接引用,符號(hào)引用指向一個(gè)未被加載的類,或者未被加載類的字段或方法,那么解析將觸發(fā)這個(gè)類的加載
執(zhí)行類的構(gòu)造器方法init
()的過程,若該類具有父類,jvm
會(huì)保證父類的init
先執(zhí)行,然后在執(zhí)行子類的init
。
啟動(dòng)類加載器是由C/C++語言實(shí)現(xiàn)的,用來加載Java核心類庫。啟動(dòng)類只加載包名為:java、javax、sun開頭的類
父類加載器為啟動(dòng)類加載器
。加載以下兩個(gè)目錄中的類庫:
java.ext.dirs
目錄
JDK安裝目錄:jre/lib/ext
目錄
我們就可以將我們自己的包放在以上目錄下,就會(huì)自動(dòng)加載進(jìn)來了。
父類加載器為啟動(dòng)類加載器
,負(fù)責(zé)加載環(huán)境變量classpath
或者系統(tǒng)屬性java.class.path
指定路徑下的類庫,是程序中默認(rèn)的類加載器,我們Java程序中的類,都是由它加載完成的。
繼承java.lang.ClassLoader
類,重寫findClass()方法 。如果沒有太復(fù)雜的需求,可以直接繼承URLClassLoader
類,重寫loadClass
方法。
作用
加密:Java代碼可以輕易的被反編譯,如果你需要把自己的代碼進(jìn)行加密以防止反編譯,可以先將編譯后的代碼用某種加密算法加密,類加密后就不能再用Java的ClassLoader去加載類了,這時(shí)就需要自定義ClassLoader在加載類的時(shí)候先解密類,然后再加載。
從非標(biāo)準(zhǔn)的來源加載代碼:如果你的字節(jié)碼是放在數(shù)據(jù)庫、甚至是在云端,就可以自定義類加載器,從指定的來源加載類。
jvm對class文件采用的是按需加載的方式,當(dāng)需要使用該類時(shí),jvm才會(huì)將它的class文件加載到內(nèi)存中產(chǎn)生class對象。在加載類的時(shí)候,是采用的雙親委派機(jī)制
。
如果一個(gè)類加載器
接收到了類加載
的請求,它自己不會(huì)先去加載,會(huì)把這個(gè)請求委托給父類加載器
去執(zhí)行。
如果父類還存在父類加載器,則繼續(xù)向上委托,一直委托到啟動(dòng)類加載器:Bootstrap ClassLoader
如果父類加載器可以完成加載任務(wù),就返回成功結(jié)果,如果父類加載失敗,就由子類自己去嘗試加載,如果子類加載失敗就會(huì)拋出ClassNotFoundException
異常,這就是雙親委派模式
打破雙親委派模型
用途:
Java應(yīng)用中存在著很多服務(wù)提供者接口(Service Provider Interface,SPI),這些接口允許第三方為它們提供實(shí)現(xiàn),如常見的 SPI 有 JDBC、JNDI等,這些 SPI 的接口屬于 Java 核心庫,一般存在rt.jar包中,由Bootstrap類加載器加載。而Bootstrap類加載器無法直接加載SPI的實(shí)現(xiàn)類,所以需要反向委派給其他類加載器進(jìn)行加載
在Tomcat服務(wù)器中,存在一個(gè)服務(wù)器運(yùn)行多個(gè)不同版本但同名服務(wù)的需求,所以需要打破雙親委派模型,加載多個(gè)同名類。
方法:
使用上下文類加載器
重寫loadClass
方法
讀到這里,這篇“Java類加載過程與類加載器是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。