簡單說說你了解的類加載器,可以打破雙親委派么,怎么打破。
1) 什么是類加載器?
類加載器 就是根據指定全限定名稱將class文件加載到JVM內存,轉為Class對象。
- 啟動類加載器(Bootstrap ClassLoader):由C++語言實現(針對HotSpot),負責將存放在<JAVA_HOME>\lib目錄或-Xbootclasspath參數指定的路徑中的類庫加載到內存中。
- 其他類加載器:由Java語言實現,繼承自抽象類ClassLoader。如:
- 擴展類加載器(Extension ClassLoader):負責加載<JAVA_HOME>\lib\ext目錄或java.ext.dirs系統變量指定的路徑中的所有類庫。
- 應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,我們可以直接使用這個類加載器。一般情況,如果我們沒有自定義類加載器默認就是用這個加載器。
2)雙親委派模型
雙親委派模型工作過程是:
如果一個類加載器收到類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器完成。每個類加載器都是如此,只有當父加載器在自己的搜索范圍內找不到指定的類時(即ClassNotFoundException),子加載器才會嘗試自己去加載。
雙親委派模型中的"雙親"並不是指它有兩個父類加載器的意思,一個類加載器只應該有一個父加載器。上面的步驟中,有兩個角色:
- 父類加載器(parent classloader):它可以替子加載器嘗試加載類
- 引導類加載器(bootstrap classloader): 子類加載器只能判斷某個類是否被引導類加載器加載過,而不能委托它加載某個類;換句話說,就是子類加載器不能接觸到引導類加載器,引導類加載器對其他類加載器而言是透明的。
3)為什么需要雙親委派模型?
在這里,先想一下,如果沒有雙親委派,那么用戶是不是可以自己定義一個java.lang.Object的同名類,java.lang.String的同名類,並把它放到ClassPath中,那么類之間的比較結果及類的唯一性將無法保證,因此,為什么需要雙親委派模型?防止內存中出現多份同樣的字節碼
怎么打破雙親委派模型?
打破雙親委派機制則不僅要繼承ClassLoader類,還要重寫loadClass和findClass方法。