Java類加載器
類加載器(class loader)
用來加載 Java 類到 Java 虛擬機(jī)中施籍。Java 源程序(.java 文件) 編譯器編譯后就被轉(zhuǎn)換成 Java 字節(jié)代碼(.class 文件)。類加載器負(fù)責(zé)讀取 Java 字節(jié)代碼歧蕉,并轉(zhuǎn)換成 java.lang.Class類的一個(gè)實(shí)例委煤。每個(gè)這樣的實(shí)例用來表示一個(gè) Java 類。通過此實(shí)例的 newInstance()方法就可以創(chuàng)建出該類的一個(gè)對(duì)象棒卷。 Java 字節(jié)代碼可能是通過工具動(dòng)態(tài)生成的顾孽,也可能是通過網(wǎng)絡(luò)下載的。 基本上所有的類加載器都是 java.lang.ClassLoader類的一個(gè)實(shí)例
類加載器分類
系統(tǒng)提供的
- 引導(dǎo)類加載器(bootstrap class loader):加載 Java 的核心庫(kù)娇跟,是用原生代碼來實(shí)現(xiàn)的岩齿,并不繼承自 java.lang.ClassLoader。(C++實(shí)現(xiàn),屬虛擬機(jī))lib/rt.jar
- 擴(kuò)展類加載器(extensions class loader):它用來加載 Java 的擴(kuò)展庫(kù)苞俘。DIR:$JAVA_HOME/lib/ext
- 系統(tǒng)類加載器(system class loader):它根據(jù)(CLASSPATH)來加載 Java 類。一般來說龄章,Java 應(yīng)用的類都是由它來完成加載的吃谣∑蚍猓可以通過 ClassLoader.getSystemClassLoader()來獲取它。
自定義
- 應(yīng)用開發(fā)者自定義類加載器(Tomcat Web 容器)
Java雙親委派
當(dāng)類加載器收到類加載任務(wù)岗憋,會(huì)先交給其父類加載器去完成加載肃晚,因此最終加載任務(wù)都會(huì)傳遞到頂層的啟動(dòng)類加載器,只有當(dāng)父類加載器無法完成加載任務(wù)時(shí)仔戈,才會(huì)嘗試執(zhí)行加載任務(wù)关串。
采用雙親委派的一個(gè)好處是比如加載位于rt.jar包中的類java.lang.Object,不管是哪個(gè)加載器加載這個(gè)類监徘,最終都是委托給頂層的啟動(dòng)類加載器進(jìn)行加載晋修,這樣就保證了使用不同的類加載器最終得到的都是同樣一個(gè)Object對(duì)象。
? 雙親委派優(yōu)先父加載器加載, 但Java Servlet規(guī)范采用優(yōu)先當(dāng)前類加載器加載,加載失敗再委托父代理加載
類加載器與 OSGi
OSGi?是 Java 上的動(dòng)態(tài)模塊系統(tǒng)凰盔。它為開發(fā)人員提供了面向服務(wù)和基于組件的運(yùn)行環(huán)境墓卦,并提供標(biāo)準(zhǔn)的方式用來管理軟件的生命周期。
OSGi 中的每個(gè)模塊(bundle)都包含 Java 包和類户敬。模塊可以聲明它所依賴的需要導(dǎo)入(import)的其它模塊的 Java 包和類(通過 Import-Package)落剪,也可以聲明導(dǎo)出(export)自己的包和類,供其它模塊使用(通過 Export-Package
)尿庐。也就是說需要能夠隱藏和共享一個(gè)模塊中的某些 Java 包和類忠怖。這是通過 OSGi 特有的類加載器機(jī)制來實(shí)現(xiàn)的。OSGi 中的每個(gè)模塊都有對(duì)應(yīng)的一個(gè)類加載器抄瑟。它負(fù)責(zé)加載模塊自己包含的 Java 包和類凡泣。當(dāng)它需要加載 Java 核心庫(kù)的類時(shí)(以 java開頭的包和類),它會(huì)代理給父類加載器(通常是啟動(dòng)類加載器)來完成锐借。當(dāng)它需要加載所導(dǎo)入的 Java 類時(shí)问麸,它會(huì)代理給導(dǎo)出此 Java 類的模塊來完成加載。模塊也可以顯式的聲明某些 Java 包和類钞翔,必須由父類加載器來加載严卖。只需要設(shè)置系統(tǒng)屬性 org.osgi.framework.bootdelegation的值即可。
解決依賴沖突的主要技術(shù),同時(shí)日常使用的熱部署,熱重載都是該類技術(shù)得以實(shí)現(xiàn).項(xiàng)目模塊化皆因此開始
參考資料
(IBM): https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html "深入探討 Java 類加載器"
[掘金]: https://juejin.im/post/5b001f44518825428b390eee "JVM 面試知識(shí)整理"