java--類加載機制
java--類加載機制
概述
Java是運行在Java的虛擬機(JVM)中的,但是它是如何運行在JVM中了呢?我們在IDE中編寫的Java源代碼被編譯器編譯成.class的字節碼文件。然后由ClassLoader負責將這些class文件給加載到JVM中去執行。
Java從編碼到執行大概流程如圖:

類加載流程

當一個類收到了類加載請求,他不會直接加載類,而是通過雙親委派機制選擇合適的類加載器去加載
雙親委派機制
JVM中提供了三層的ClassLoader:
BootstrapClassLoader:主要負責加載核心的類庫(rt.jar 等)。
ExtensionClassLoader:主要負責加載jre/lib/ext目錄下的一些擴展的jar。
ApplicationClassLoader:主要負責加載應用程序的
雙親委派圖解:

當一個Hello.class這樣的文件要被加載時。不考慮我們自定義類加載器,首先會在AppClassLoader中檢查是否加載過,如果有那就無需再加載了。如果沒有,那么會拿到父加載器,然后調用父加載器的loadClass方法。父類中同理也會先檢查自己是否已經加載過,如果沒有再往上。注意這個類似遞歸的過程,直到到達Bootstrap classLoader之前,都是在檢查是否加載過,并不會選擇自己去加載。直到BootstrapClassLoader,已經沒有父加載器了,這時候開始考慮自己是否能加載了,如果自己無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException
可以通過實現classLoader打破雙親委派
為什么要設計這種機制
1、防止類核心被篡改,如果有人想替換系統級別的類:String.java。篡改它的實現,在這種機制下這些系統的類已經被Bootstrap classLoader加載過了(為什么?因為當一個類需要加載的時候,最先去嘗試加載的就是BootstrapClassLoader),所以其他類加載器并沒有機會再去加載,從一定程度上防止了危險代碼的植入
2、避免類的重復加載
類加載
Java 類加載(Class Loading)指的是將類的字節碼文件加載到 Java 虛擬機中,并轉換成 Java 類模板對象(Class Object)的過程。在 Java 中,類加載器負責加載類,并將類加載到 Java 虛擬機內存中,使得 Java 程序可以運行。
類加載過程
當程序主動使用某個類時,如果該類還未被加載到內存中,則系統會通過如下三個步驟來對該類進行初始化。
-
加載(Loading):將字節碼文件讀入內存,并生成對應的 Class 對象,這個過程由類加載器完成。
-
連接(Linking):
- 驗證(Verification):確保字節碼符合 Java 虛擬機規范,并且沒有安全漏洞。
- 準備(Preparation):為類的靜態變量分配存儲空間,并設置默認初始值。
- 解析(Resolution):將類中的符號引用轉換成直接引用,即將常量池中的符號引用轉換成內存地址。
-
初始化(Initialization):為類的靜態變量賦值,并執行靜態代碼塊。
浙公網安備 33010602011771號