中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中類的加載器及加載過程是什么

發布時間:2023-04-19 17:17:39 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Java中類的加載器及加載過程是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java中類的加載器及加載過程是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

Java中類的加載器及其加載過程

概述

字節碼文件在類加載器子系統中要進行加載、鏈接、初始化等處理,我們這里詳細來談其中過程

類加載器子系統負責從文件系統或網絡中加載Class文件,且ClassLoader只負責class文件的加載,至于其能否運行,則交由ExecutionEngine來判斷。

加載的類信息存放于一塊稱為方法區的內存空間。除了類的信息以外,方法區中還會存放運行時常量池信息,可能還包括字符串字面量和數字常量(這部分常量信息是Class文件中常量池部分的內存映射)

Java中類的加載器及加載過程是什么

class文件最終加載到JVM中,根據這個文件可以實例化出n個一模一樣的實例,加載到JVM的class文件則被稱為DNA元數據模板,放在方法區。而在這整個文件到元數據模板的過程中,類裝載器就起到了一個轉換器的作用

轉換和執行過程:

Java中類的加載器及加載過程是什么

首先需要裝載目標類,再進行鏈接,然后對其進行初始化,最終調用對應類中的方法

所以,類的加載過程如下

Java中類的加載器及加載過程是什么

過程一:Loading

這個過程也稱為加載,但和類的加載不同,這個加載只是其中的一個環節,切莫搞混,我們這里用Loading來代替,以防混淆

Loading過程:

  • 通過一個類的全限定名獲取定義此類的二進制字節流

  • 將這個字節流所代表的靜態存儲結構轉化為方法去的運行時數據結構

  • 再內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口

加載.class文件的幾種方式:

  • 從本地系統中直接加載

  • 通過系統網絡獲取,典型場景:Web Applet

  • 從zip壓縮包中獲取,成為日后jar、war格式的基礎

  • 運行時計算生成,使用最多的是:動態代理技術

  • 由其他文件生成,典型場景:JSP應用

  • 從專有數據庫中提取.class文件,比較少見

  • 從加密文件中獲取

過程二:Linking

鏈接階段包括驗證(Verify)、準備(Prepare)、解析(Resolve)

Verify

目的在于確保Class文件的字節流中包含信息符合當前虛擬機要求,保證被加載類的正確性,不會威脅虛擬機自身的安全。

驗證有四種形式:

  • 文件格式驗證

  • 元數據驗證

  • 字節碼驗證

  • 符號引用驗證

e.g.:

class字節碼文件中以CAFEBABE開頭,以供識別

Prepare

該階段為類的變量分配內存表并且設置該變量的默認初始值,即零值。

不包含用final修飾的static,因為final在編譯的時候就會分配了,準備階段會進行顯式初始化

同樣也不會為實例變量分配初始化,類變量會分配在方法區中,但實例變量會隨著對象一起分配到java堆

Resolve

該階段將常量池內的符號引用轉換為直接引用的過程

事實上,解析操作往往會伴隨著JVM在執行完初始化之后再執行

符號引用就是一組符號來描述所引用的目標,符號引用的字面量形式明確定義在《java虛擬機規范》的class文件格式中。直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄

解析動作主要針對類或接口、字段、類方法、接口方法、方法類型等。對應常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等

過程三:Initialization

該過程是執行類構造器方法()的過程

此方法不需定義,是javac虛擬機自動收集類中的所有類變量的賦值動作靜態代碼塊中的語句合并而來,所以如果沒有這兩項操作,就不存在這個過程。

這里會出現一個神奇的現象:

static{
    number = 20;
}
private static int number = 10;

這樣也可以執行,而執行結果為10,究其原因,number在prepare中早已初始化,并賦值為0,而來到Initialization階段中才會開始進行賦值,首先執行static塊中的number = 20,后再執行number = 10的賦值操作,最后結果為10。

*但在static中不能對其進行引用/調用,比如打印操作,會報錯:Illegal forward reference*

構造器方法中指令按語句在源文件中出現的順序執行

()不同于類的構造器(關聯:構造器是虛擬機視角下的())

若該類具有父類,JVM會保證子類的()執行前,父類的()已經執行完畢

虛擬機必須保證一個類的()方法在多線程下被同步加鎖

讀到這里,這篇“Java中類的加載器及加載過程是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

毕节市| 富川| 轮台县| 瑞昌市| 安阳县| 新密市| 通州市| 台东县| 西充县| 两当县| 将乐县| 绵竹市| 江阴市| 成武县| 米泉市| 金山区| 郴州市| 长宁县| 修文县| 红河县| 呼伦贝尔市| 娱乐| 安新县| 文安县| 黑龙江省| 商城县| 永春县| 高要市| 奉贤区| 两当县| 白玉县| 甘泉县| 怀柔区| 江达县| 镶黄旗| 行唐县| 上思县| 察哈| 鹤岗市| 惠来县| 同仁县|