您好,登錄后才能下訂單哦!
Java類加載過程
首先是加載過程(Loading),它是 Java 將字節碼數據從不同的數據源讀取到 JVM 中,并映射為 JVM 認可的數據結構(Class 對象),這里的數據源可能是各種各樣的形態,比如 jar 文件,class 文件,甚至是網絡數據源等;如果輸入數據不是 ClassFile 的結構,則會拋出 ClassFormatError。加載階段是用戶參與的階段,我們可以自定義類加載器,去實現自己的類加載過程。
第二階段是連接(Linking),這是核心的步驟,簡單說是把原始的類定義信息平滑地轉入 JVM 運行的過程中。這里可進一步細分成三個步驟:1,驗證(Verification),這是虛擬機安全的重要保障,JVM 需要核驗字節信息是符合 Java 虛擬機規范的,否則就被認為是 VerifyError,這樣就防止了惡意信息或者不合規信息危害 JVM 的運行,驗證階段有可能觸發更多 class 的加載。2,準備(Pereparation),創建類或者接口中的靜態變量,并初始化靜態變量的初始值。但這里的“初始化”和下面的顯示初始化階段是有區別的,側重點在于分配所需要的內存空間,不會去執行更進一步的 JVM 指令。3,解析(Resolution),在這一步會將常量池中的符號引用(symbolic reference)替換為直接引用。在 Java 虛擬機規范中,詳細介紹了類,接口,方法和字段等各方面的解析。
最后是初始化階段(initialization),這一步真正去執行類初始化的代碼邏輯,包括靜態字段賦值的動作,以及執行類定義中的靜態初始化塊內的邏輯,編譯器在編譯階段就會把這部分邏輯整理好,父類型的初始化邏輯優先于當前類型的邏輯。再來談談雙親委派模型,簡單說就是當加載器(Class-Loader)試圖加載某個類型的時候,除非父類加載器找不到相應類型,否則盡量將這個任務代理給當前加載器的父加載器去做。使用委派模型的目的是避免重復加載 Java 類型。
自定義類加載器的常見場景
實現類似進程內隔離,類加載器實際上用作不同的命名空間,以及提供類似容器,模塊化的效果。例如:1,兩個模塊依賴于某個類庫的不同版本,如果分別被不同的容器加載,就可以互不干擾。這個方面的集大成者是 Jave EE 和 OSGL,JPMS等框架。2,應用需要從不同的數據源獲取類定義信息,例如網絡數據源,而不是本地文件系統。3,或者是需要自己操縱字節碼,動態修改生成類型。
我們可以總體上簡單理解自定義類加載過程:1,通過指定名稱,找到其二進制實現,這里往往就是自定義類加載器會“定制”的部分,例如,在特定數據源根據名字獲取字節碼,或者修改或生成字節碼。2,然后,創建 Class 對象,并完成類加載過程。二進制信息到 class 對象的轉換,通常就依賴 defineClass,我們無需自己實現,它是 final 方法。有了 Class 對象,后續完成加載過程就順利成章了。
以上就是Java類加載過程的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。