類加載器的一點知識

JVM有多個虛擬機,系統默認三個主要類加載器
(即BootStrap,ExtClassLoader加載jre/ext文件夾下的jar包 , AppClassLoader加載jre/lib/rt.jar裏面就是所有常用java類比如io awt util等)類加載器也是普通的java類。
最根源的類加載器是用C++寫的(即BootStrap),這個加載器隨着JVM啓動而啓動,然後在調用別的用java寫好的類加載器。

加載器繼承圖:

BootStap (jre/lib/rt.jar 常用類所在的位置 比如util  io  awt)
   |
   |
ExtClassLoader (jre/lib/ext/*.jar 擴展包所在的位置)
   |
   |
AppClassLoader (classpath指定的所有jar或者目錄)
   |
   |
自定義類加載器XXXClassLoader(自定義加載指定方位的文件)

 

loadclass的時候,尋找確定的類加載器的順序:

    在使用類加載器加載類的時候,都要先去最祖先BootStap裏面找是否加載過,如果沒有向下繼續,用這種方式來找真正要使用的是哪個類加載器。
 使用這種方式便於集中管理,否則比如自定義類加載器A,B在自己制定範圍文件夾內都找到了同一個class文件的時候,那麼應該聽誰的呢,就產生了混亂。
   因此採用向上查詢的方式來確定使用哪種類加載器,如果找到了確認使用這個類加載器,那麼在加載類A的時候,發現類A引用類B那麼繼續使用當前線程
   找到的這個類加載器繼續加載類B。
   如果逐層找沒有找到需要的類加載器,那麼返回發起者的類加載器後如果仍舊加載不了,拋出ClassNotFuound異常。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章