類的加載:
加載指的是將類的class檔案讀入到記憶體,并為之創建一個java.lang.Class物件,也就是說,當程式中使用任何類時,系統都會為之建立一個java.lang.Class物件,
類的加載由類加載器完成,類加載器通常由JVM提供,這些類加載器也是前面所有程式運行的基礎,JVM提供的這些類加載器通常被稱為系統類加載器,除此之外,開發者可以通過繼承ClassLoader基類來創建自己的類加載器,
雙親委派機制 的作業原理
1)如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執行,
2)如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞回請求最終將到達頂層的啟動類加載器,
3)如果父類加載器可以完成類加載任務,就成功回傳,倘若父類加載器無法完成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式,

案例舉例:
下面我們不妨通過一個例子來幫助我們理解一下雙親委派機制:
首先我們在工程下創建一個java.lang包,包下新建一個String類(我們在此只做示范,實際代碼中不推薦同學們以此命名)

在String類中加入以下代碼:
package java.lang;
public class String {
static {
System.out.println("我是java.lang包下的String類");
}
}
我們可以將其看成一個我們手寫的一個”偽裝“的String類
接著我們在工程的另一個包下新建一個StringTest類

其中加入以下方法:
package Test;
public class StringTest {
public static void main(String[] args) {
String str=new java.lang.String();
System.out.println("開始測驗,,,");
}
}
那么問題來了,當我們new java.lang包下的String類時,我們new的是java系統包下的String呢還是我們剛剛自己定義的String類呢?
換言之,我們在上面定義的String類中加入的static靜態代碼塊會不會執行呢??
請看運行結果:

很顯然,static靜態代碼塊并沒有執行,我們new 的String類仍是系統包下的String類,
案例決議:
這便是雙親委派機制的完美體現,很好保證了我們系統核心API不容易被破壞,
當我們new String時,我們自己創建的String類應當由系統類加載器(應用程式類加載器)來加載,但根據雙親委派機制,系統類加載器會先委托給它的父類加載器(拓展類加載器)去加載,如果拓展類加載器仍存在父類則繼續向上委托,
我們 new String時向上委托會被引導類加載器(BootStap ClassLoader)所加載,所以我們new 出的String便是我們核心API中的String類,即不會再new我們自己創建的String類,
雙親委派機制的優勢:
1)避免類的重復加載
2)保護程式安全,防止核心API被隨意篡改
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195826.html
標籤:其他
上一篇:我服了!花重金求來的并發編程筆記,看完不得不獻出我的膝蓋!
下一篇:離線電燈控制模塊
