加群聯系作者vx:xiaoda0423
倉庫地址:https://webvueblog.github.io/JavaPlusDoc/
https://1024bat.cn/
類加載器
類與類加載器
判斷類是否“相等”
任意一個類,都由加載它的類加載器和這個類本身一同確立其在 Java 虛擬機中的唯一性,每一個類加載器,都有一個獨立的類名稱空間。
因此,比較兩個類是否“相等”,只有在這兩個類是由同一個類加載器加載的前提下才有意義,否則,即使這兩個類來源于同一個 Class 文件,被同一個虛擬機加載,只要加載它們的類加載器不同,那么這兩個類就必定不相等。
這里的“相等”,包括代表類的 Class 對象的?equals()
?方法、isInstance()
?方法的返回結果,也包括使用 instanceof 關鍵字做對象所屬關系判定等情況。
加載器種類
系統提供了 3 種類加載器:
啟動類加載器(Bootstrap ClassLoader): 負責將存放在?
<JAVA_HOME>\lib
?目錄中的,并且能被虛擬機識別的(僅按照文件名識別,如 rt.jar,名字不符合的類庫即使放在 lib 目錄中也不會被加載)類庫加載到虛擬機內存中。擴展類加載器(Extension ClassLoader): 負責加載?
<JAVA_HOME>\lib\ext
?目錄中的所有類庫,開發者可以直接使用擴展類加載器。應用程序類加載器(Application ClassLoader): 由于這個類加載器是 ClassLoader 中的?
getSystemClassLoader()
?方法的返回值,所以一般也稱它為“系統類加載器”。它負責加載用戶類路徑(classpath)上所指定的類庫,開發者可以直接使用這個類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。
當然,如果有必要,還可以加入自己定義的類加載器。
雙親委派模型
什么是雙親委派模型
雙親委派模型是描述類加載器之間的層次關系。它要求除了頂層的啟動類加載器外,其余的類加載器都應當有自己的父類加載器。(父子關系一般不會以繼承的關系實現,而是以組合關系來復用父加載器的代碼)
工作過程
如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器中,只有當父加載器反饋自己無法完成這個加載請求(找不到所需的類)時,子加載器才會嘗試自己去加載。
在 java.lang.ClassLoader 中的?loadClass
?方法中實現該過程。
為什么使用雙親委派模型
像 java.lang.Object 這些存放在 rt.jar 中的類,無論使用哪個類加載器加載,最終都會委派給最頂端的啟動類加載器加載,從而使得不同加載器加載的 Object 類都是同一個。
相反,如果沒有使用雙親委派模型,由各個類加載器自行去加載的話,如果用戶自己編寫了一個稱為 java.lang.Object 的類,并放在 classpath 下,那么系統將會出現多個不同的 Object 類,Java 類型體系中最基礎的行為也就無法保證。
平臺通用應答
消息ID: 0x8001
消息體:每個不同的命令消息體格式內容由各命令確定