詳細地址參見 ImportNewhtml
http://www.importnew.com/19903.htmljava
重點介紹下類加載的雙親委派模型面試
簡介:
雙親委派模型要求除了頂層的啓動類加載器外,其餘的類加載器都應當有本身的父類加載器。這裏類加載器之間的父子關係通常不會以繼承關係來實現,而是都使用組合關係來複用父加載器的代碼code
工做過程:
若是一個類加載器收到了類加載的請求,它首先不會本身去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每個層次的類加載器都是如此,所以全部的加載請求最終都應該傳遞到頂層的啓動類加載器中,只有當父類加載器反饋本身沒法完成這個請求(它的搜索範圍中沒有找到所需的類)時,子加載器纔會嘗試本身去加載htm
好處:
Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係。例如類Object,它放在rt.jar中,不管哪個類加載器要加載這個類,最終都是委派給啓動類加載器進行加載,所以Object類在程序的各類類加載器環境中都是同一個類判斷兩個類是否相同是經過classloader.class這種方式進行的,因此哪怕是同一個class文件若是被兩個classloader加載,那麼他們也是不一樣的類繼承
一道面試題:ssl
能不能本身寫個類叫java.lang.System
?class
答案:一般不能夠,但能夠採起另類方法達到這個需求。
解釋:爲了避免讓咱們寫System類,類加載採用委託機制,這樣能夠保證爸爸們優先,爸爸們能找到的類,兒子就沒有機會加載。而System類是Bootstrap加載器加載的,就算本身重寫,也老是使用Java系統提供的System,本身寫的System類根本沒有機會獲得加載。import
可是,咱們能夠本身定義一個類加載器來達到這個目的,爲了不雙親委託機制,這個類加載器也必須是特殊的。因爲系統自帶的三個類加載器都加載特定目錄下的類,若是咱們本身的類加載器放在一個特殊的目錄,那麼系統的加載器就沒法加載,也就是最終仍是由咱們本身的加載器加載。搜索