類加載-雙親委托機制


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM