4.類加載器java
1.概述spa
2.類與類加載器設計
3.雙親委派模型orm
1.概述對象
虛擬機設計團隊把類加載階段中的「經過一個類的全限定名和來獲取描述此類的二進制字節流」這個動做放到Java虛擬機外部去實現,以便讓應用程序本身決定如何獲取所須要的類。實現這個動做的代碼模塊稱爲「類加載器」。繼承
2.類與類加載器開發
類加載器雖然只用於實現類的加載動做,但它在Java程序中起到的做用卻遠遠不限於類加載階段。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立其在Java虛擬機中的惟一性,每個加載器,都擁有一個獨立的類名稱空間。虛擬機
通俗來講:比較兩個類是否「相等」,只有在這兩個類是由同一個類加載器加載的前提下才有意義,不然,及時這兩個類來源於同一個Class文件,被同一個虛擬機加載,只要加載這它們的類加載器不一樣,那這兩個類就一定不相等。io
這裏所指的「相等」,包括表明類的Class對象(以前說的類的入口)的equals()方法、isAssignableForm()方法的返回結果,也包括使用instanceof關鍵字對對象所屬關係作斷定等狀況。class
3.雙親委派模型
從Java虛擬機的角度來說,只存在兩種不一樣的類加載器:一種是啓動類加載器(Bootstrap ClassLoader),這個類加載器使用C++語言實現,是虛擬機自身的一部分;另外一種就是全部其餘的類加載器,這些類加載器都有Java序言實現,獨立於虛擬機外部,而且所有繼承自抽象類java.lang.ClassLoader。
細緻可分爲三類:
①啓動類加載器(Bootstrap ClassLoader)
②擴展類加載器(Extension ClassLoader)
③應用程序類加載器(Application ClassLoader):也稱爲系統類加載器。它負責加載用戶類路徑(classPath)上所指定的類庫,開發者能夠直接使用這個類加載器。
如圖展現的類加載之間的這種層次關係,稱爲類加載器的雙親委派模型(Parents Delegation Model)。
雙親委派模型要求除了頂層的類加載器外,其他的類加載器都應當有本身的父類加載器。這裏的類加載器之間的父子關係通常不會以繼承的關係來實現,而是都使用組合關係來複用父加載器的代碼。
雙親委派模型的工做過程是:若是一個類加載器收到了類加載的請求,他首先不會本身去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每個層次的類加載器都是如此,所以全部的加載請求最終都應該傳送到頂層的啓動類加載器中,只有當父加載器反饋本身沒法完成這個加載請求(它的搜算範圍中沒有找到所需的類)時,子加載器纔會嘗試本身去加載。
好處:Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係。例如,不管哪個類加載要加載java.lang.Object類,最終都會爲派給頂端的啓動類加載器去完成,所以java.lang.Object類在程序的各個類加載器環境中都是同一個類。若是沒有使用雙親委派模型,由各個類加載器去自行加載的話,若是用戶本身編寫了一個稱爲java.lang.Object類,而且放在程序的ClassPath中,那系統中將會出現多個不一樣的Object類,Java類型體系中最基礎的行爲也就沒法保障。
邏輯實現:先檢查是否已經被加載過,若沒有加載則調用父加載器的loadClass()方法,若附加在其爲空默認使用啓動類加載器做爲父加載器。若是父類加載失敗,拋出ClassNotFoundException異常後,再調用本身的FindClass()方法進行加載。