Java的類加載器都有哪些,每一個類加載器都有加載那些類,什麼是雙親委派模型,是作什麼的?

類加載器按照層次,從頂層到底層,分爲如下三種:java

(1)啓動類加載器(Bootstrap ClassLoader)spa

這個類加載器負責將存放在JAVA_HOME/lib下的,或者被-Xbootclasspath參數所指定的路徑中的,而且是虛擬機識別的類庫加載到虛擬機內存中。啓動類加載器沒法被Java程序直接引用。繼承

(2)擴展類加載器(Extension ClassLoader)內存

這個加載器負責加載JAVA_HOME/lib/ext目錄中的,或者被java.ext.dirs系統變量所指定的路徑中的全部類庫,開發者能夠直接使用擴展類加載器ssl

(3)應用程序類加載器(Application ClassLoader)開發

這個加載器是ClassLoader中getSystemClassLoader()方法的返回值,因此通常也稱它爲系統類加載器。它負責加載用戶類路徑(Classpath)上所指定的類庫,可直接使用這個加載器,若是應用程序沒有自定義本身的類加載器,通常狀況下這個就是程序中默認的類加載器get

雙親委派模型:虛擬機

雙親委派模型要求除了頂層的啓動類加載器外,其餘的類加載器都應當有本身的父類加載器。這裏類加載器之間的父子關係通常不會以繼承關係來實現,而是都使用組合關係來複用父加載器的代碼io

工做過程:class

若是一個類加載器收到了類加載的請求,它首先不會本身去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每個層次的類加載器都是如此,所以全部的加載請求最終都應該傳遞到頂層的啓動類加載器中,只有當父類加載器反饋本身沒法完成這個請求(它的搜索範圍中沒有找到所需的類)時,子加載器纔會嘗試本身去加載。

好處:

Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係。例如類Object,它放在rt.jar中,不管哪個類加載器要加載這個類,最終都是委派給啓動類加載器進行加載,所以Object類在程序的各類類加載器環境中都是同一個類,判斷兩個類是否相同是經過classloader.class這種方式進行的,因此哪怕是同一個class文件若是被兩個classloader加載,那麼他們也是不一樣的類。

相關文章
相關標籤/搜索