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