1. 程式人生 > 其它 >雙親委派模型【~類載入器】

雙親委派模型【~類載入器】

雙親委派模型【~類載入器】

1,談論雙親模型前,咱先了解一下什麼是類載入器哈,因為雙親模型源頭與之有關。

類載入階段:虛擬機器設計者是這樣設計的,“通過一個類的全限定名【絕對路徑】來獲取該類的二進位制位元組流”,

~例如:Class.forName("類的全限定名");這個動作是在類載入器的幫助下完成的,也是Java 虛擬機器外部去實現的。

● 載入類~首先jvm先找到指定的類,然後通過“類載入器”把類裝載到虛擬機器上。

【打個比方:咱的小貓咪嗅到魚罐頭後,不會開啟魚罐頭,主人過來幫它開啟魚罐頭,小貓咪就把罐頭魚吃到肚子裡】

~主人幫開魚罐頭,就好比“類載入器”(程式碼模組)幫jvm裝載指定的類。

2,從 Java 虛擬機器的角度來講,只存在以下兩種不同的類載入器:

啟動類載入器(Bootstrap ClassLoader),使用 C++ 實現,是虛擬機器自身的一部分
其它類的載入器使用 Java 實現,獨立於虛擬機器,並且全部繼承自抽象類 java.lang.ClassLoader。

3,類載入器細分:啟動類載入器、擴充套件類載入器、應用類載入器、自定義類載入器

4,雙親委派模型,即定義了jvm載入類時的載入規則而已。類載入器的層次關係,稱為類載入器的雙親委派模型

該模型要求除了頂層的啟動類載入器外,其它的類載入器都要有自己的父類載入器。

一言概之,雙親委派模型,其實就是一種類載入器的層次關係


所謂雙親委派是指每次收到類載入請求時,先將請求委派給父類載入器完成(所有載入請求最終會委派到頂層的Bootstrap ClassLoader載入器中),

如果父類載入器無法完成這個載入(該載入器的搜尋範圍中沒有找到對應的類),子類嘗試自己載入,

如果都沒載入到,則會丟擲 ClassNotFoundException 異常。

5,為什麼要有雙親委派模型的存在?

以“為什麼我們不能定義同名的String的 java 檔案?”為例子說明.

因為這樣可以避免重複載入,當父親已經載入了該類的時候,就沒有必要 ClassLoader 再載入一次。
考慮到安全因素,我們試想一下,如果不使用這種委託模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義的型別,這樣會存在非常大的安全隱患,
而雙親委託的方式,就可以避免這種情況,因為String 已經在啟動時就被引導類載入器(Bootstrcp ClassLoader)載入,所以使用者自定義的ClassLoader永遠也無法載入一個自己寫的String,
除非你改變 JDK 中 ClassLoader 搜尋類的預設演算法。

6,兩種類的載入方式

通常用這兩種方式來動態載入一個 java 類,Class.forName()ClassLoader.loadClass()

但是兩個方法之間也是有一些細微的差別。。。。。

參考文章:

《雙親委派模型:大廠高頻面試題,輕鬆搞定~https://blog.csdn.net/yusimiao/article/details/99301293》

《一文搞懂雙親委派模型~https://blog.csdn.net/u013568373/article/details/93995246》