類加載器
簡單講,類加載器ClassLoader的功能就是負責將class檔案加載到jvm記憶體,
類加載器分類
從虛擬機層面講分為兩大型別的類加載器,一是Bootstrap Classloader即啟動類加載器(C++實作),它是虛擬機的一部分,二是其他型別類加載器(JAVA實作),在虛擬機外部,并全部繼承ClassLoader類,

從細分的角度講會分為以下三類類加載器:
1、Bootsrap ClassLoader
啟動類加載器,完全由jvm控制加載,外面訪問不到這個類加載器,即不能被java程式參考,它主要負責加載jvm自身的作業類,即java/lib目錄和-Xbootclasspath引數指定的目錄的類別庫,
2、Extension ClassLoader
擴展類加載器,由java實作,即ExtClassLoader實作類,它主要負責加載java/lib/ext目錄和系統環境變數java.ext.dirs指定目錄所有類別庫,
3、Application ClassLoader
應用程式類加載器,由java實作,即AppClassLoader實作類,它的父類是ExtClassLoader,它主要負責加載classpath目錄上的類別庫,如果沒有自定義ClassLoader,它就是程式中默認的ClassLoader,即可以通過ClassLoader.getSystemClassLoader()獲取當前系統的類加載器,

從上圖看雖然Bootstrap ClassLoader是最頂層的類加載器,但是不能被程式參考,它也不是ExtClassLoader的父類加載器,ExtClassLoader沒有父類載器,我們不防來看下面簡單的例子,

程式首先輸出了程式默認的類加載器AppClassLoader,然后再輸出了其父類加載器ExtClassLoader,然后就完了,這就證實了上面的理論,
類加載機制
雖然定義了上面這幾個類加載器,但在加載時類加載器會審查一個class類應該由哪個型別的加載器負責加載,它使用的是等級加載機制,是一種雙親委派模型,
雙親委派模式要求所有類加載器,除了頂層的Bootstrap類加載器之外都要有自己的父類加載器,在收到一個類加載請求時,當前默認的類加載器它不會首先自己來加載這個類,它會委托給自己的父類加載器去加載,父類加載器再委托給父父類加載器,以此類推,直到頂層類加載器,由上到下加載,除非上面的類加載器都無法加載時自己才去加載,
來看看ClassLoader.loadClass方法原始碼

再回到之前文章中的有一道關于是否可以自定義類java.lang.String并使用的面試題,它在java/lib目錄下,所以當應用類加載器去classpath加載時會去委托父類加載器,這時最頂層類加載器會發現自己之前已經加載過,所以這次不再加載,所以自定義的這個java.lang.String雖然可以正常編譯,但不能被類加載器加載并使用,
所以,這也是雙親委派模式的好處,同一個路徑的類保證不能加載兩次,保證了類與類之間的正常行為和正常運行,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/227912.html
標籤:Java
上一篇:10 冒泡排序
下一篇:Spring事務的傳播屬性
