在了解雙親委派機制之前,你應當知道classloader(如果不了解,可以現在去惡補一下哈)
四種classloader
- 虛擬機自帶
- 引導類加載器(Bootstrap ClassLoader)
- 擴展類加載器(Extension ClassLoader)
- 系統類加載器(Application ClassLoader)
- 用戶自定義
- 用戶自定義類加載器,需要繼
java.lang.ClassLoader
package java.lang;
public abstract class ClassLoader {
...
}
雙親委派機制
當類加載器加載某個類時,自己先不會加載,而是委托給父類加載器,如果父類加載向上還有父類加載器那么依次向上委托,直到最頂層加載器。如果該加載器能夠加載該類,那么就由該類加載加載,如果不能則由子類加載加載。如果所有類加載都不能加載則會拋出異常
雙親委派機制的優點
- 加載類帶有優先級關系,通過這種關系可以避免重復加載
- 避免源代碼被污染
比如: 用戶自定了java.lang.String類
package java.lang;
class String {
public static void main(String[] args) {
System.out.println("........")
}
}
用戶期望的是能夠加載自定義的java.lang.String,但實際上的結果:
錯誤: 在類 java.lang.String 中找不到 main 方法, 請將 main 方法定義為:
public static void main(String[] args)
否則 JavaFX 應用程序類必須擴展javafx.application.Application
沒有找到main方法???那么證明jvm沒有加載自定義String,而是找到了java core中的java.lang.String.
這樣就防止了對java核心代碼的污染