為什么要雙親委派


對於任意一個類,都需要由加載它的類加載器和這個類本身來一同確立其在Java虛擬機中的唯一性

 

為了系統類的安全,類似“ java.lang.Object”這種核心類,jvm需要保證他們生成的對象都會被認定為同一種類型。即“通過代理模式,對於 Java 核心庫的類的加載工作由引導類加載器來統一完成,保證了 Java 應用所使用的都是同一個版本的 Java 核心庫的類,是互相兼容的”。避免用戶自己手賤,寫了個java.lang.Object

 

例如類java.lang.Object,它存放在rt.jar中,無論哪個類加載器要加載這個類,最終都會委派給啟動類加載器進行加載因此Object類在程序的各種類加載器環境中都是同一個類。相反,如果用戶自己寫了一個名為java.lang.Object的類,並放在程序的Classpath中,那系統中將會出現多個不同的Object類,java類型體系中最基礎的行為也無法保證,應用程序也會變得一片混亂。

 

能不能自己寫個類叫java.lang.System?

答案:通常不可以,但可以采取另類方法達到這個需求。

解釋:為了不讓我們寫System類,類加載采用委托機制,這樣可以保證爸爸們優先,爸爸們能找到的類,兒子就沒有機會加載。而System類是Bootstrap加載器加載的,就算自己重寫,也總是使用Java系統提供的System,自己寫的System類根本沒有機會得到加載。
但是,我們可以自己定義一個類加載器來達到這個目的,為了避免雙親委托機制,這個類加載器也必須是特殊的。由於系統自帶的三個類加載器都加載特定目錄下的類,如果我們自己的類加載器加載一個特殊的目錄,那么系統的加載器就無法加載,也就是最終還是由我們自己的加載器加載這樣還不夠,要findclass,否則loadclass仍然會從父加載器緩存找到




免責聲明!

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



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