1.基本概念
雙親委托機制:當某個特定的類加載器在接收到加載類的請求時,首先將該加載任務發送給父類加載器,若父類加載器仍有父類,則繼續向上追溯,直到最高級。
如果最高級父類能夠加載到該類,則成功返回,否則由其子類進行加載。以此類推,如果到最后一個子類還不能成功加載,則拋出一個異常。
作用:可以保證java核心庫或第三方庫的安全(防止低一級加載器加載的類覆蓋高級加載器加載的類)
2.例子: 假設我們自定義個String類,然后使用自定義類加載器進行加載,由於雙親委托機制,我們並不能成功加載我們自己定義的類,而是加載了java.lang.String類
第一步:在項目下新建一個包 包名叫做 java.lang
第二步:在這個包下新建一個類叫做 String
這時我們就創建出來一個假的java.lang.String 類,那么這個時候如果我們再使用String類時,按照正常流程應該由應用類加載器進行加載。但是由於雙親委派機制,
String類應該是由啟動類加載器(引導類加載器)加載。 好下面我們進行第三步
第三步:在這個項目中再隨便建一個包然后建一個測試類,在測試類中的main方法中new一個String字符串 並且輸出,同時輸出一下這個類的加載器
測試類中的代碼:
1 public class MyTest { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 String s = "xiaobai"; 6 System.out.println(s.getClass().getClassLoader()); //null 7 System.out.println(s); //xiaobai 8 } 9 10 }
我們看到,獲得的類加載器的結果為null 並且字符串可以正常輸出。說明使用了雙親委托機制調用了啟動類加載器進行加載String類,而不是加載我們這個假的String類。
注:由於啟動類加載器的實現方式並不是繼承ClassLoader,而是使用c++實現,所以獲得類加載器時會返回null