类装载器ClassLoader
在裝載(Load)階段,其中第(1)步:通過類的全限定名獲取其定義的二進(jìn)制字節(jié)流,需要借助類裝載器完成,顧名思義,就是用來裝載Class文件的。
(1)通過一個(gè)類的全限定名獲取定義此類的二進(jìn)制字節(jié)流
分類
1)Bootstrap ClassLoader 負(fù)責(zé)加載$JAVA_HOME中 jre/lib/rt.jar 里所有的class或Xbootclassoath選項(xiàng)指定的jar包。由C++實(shí)現(xiàn),不是ClassLoader子類。
2)Extension ClassLoader 負(fù)責(zé)加載java平臺(tái)中擴(kuò)展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目錄下的jar包。
3)App ClassLoader 負(fù)責(zé)加載classpath中指定的jar包及 Djava.class.path 所指定目錄下的類和jar包。
4)Custom ClassLoader 通過java.lang.ClassLoader的子類自定義加載class,屬于應(yīng)用程序根據(jù)自身需要自定義的ClassLoader,如tomcat、jboss都會(huì)根據(jù)j2ee規(guī)范自行實(shí)現(xiàn)ClassLoader。
圖解
加載原則
檢查某個(gè)類是否已經(jīng)加載:順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個(gè)Classloader已加載,就視為已加載此類,保證此類只所有ClassLoader加載一次。
加載的順序:加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。
雙親委派機(jī)制
定義:如果一個(gè)類加載器在接到加載類的請(qǐng)求時(shí),它首先不會(huì)自己嘗試去加載這個(gè)類,而是把這個(gè)請(qǐng)求任務(wù)委托給父類加載器去完成,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回;只有父類加載器無法完成此加載任務(wù)時(shí),才自己去加載。
優(yōu)勢(shì):Java類隨著加載它的類加載器一起具備了一種帶有優(yōu)先級(jí)的層次關(guān)系。比如,Java中的Object類,它存放在rt.jar之中,無論哪一個(gè)類加載器要加載這個(gè)類,最終都是委派給處于模型最頂端的啟動(dòng)類加載器進(jìn)行加載,因此Object在各種類加載環(huán)境中都是同一個(gè)類。如果不采用
雙親委派模型,那么由各個(gè)類加載器自己取加載的話,那么系統(tǒng)中會(huì)存在多種不同的Object類。
破壞:可以繼承ClassLoader類,然后重寫其中的loadClass方法,其他方式大家可以自己了解拓展一下。
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的类装载器ClassLoader的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类文件到虚拟机(类加载机制)
- 下一篇: 运行时数据区(Run-Time Data