載入
#當我們要使用一個類別的時候,要透過ClassLoader將類別載入到記憶體中
「類別載入階段主要完成以下三件事情」
透過全類名,取得類的二進位流 解析類別的二進位流為方法區內的資料結構 建立一個java.lang.Class類別的實例,表示該類型,作為方法區這個類別的存取入口

「透過全類別名,取得類別的二進位流的方式有很多種”
從zip壓縮包取得 從網路取得 執行階段計算生成,如動態代理技術 ...
#「對於非陣列類型的載入階段,也就是可以使用Java虛擬機器內建的類別載入器去完成,也可以使用使用者自訂的類別載入器去完成”
連結
「連結這個階段主要分為3個部分,驗證,準備,解析」
驗證
#「驗證階段主要是確保Class檔案的格式正確,運行時不會危害虛擬機器的安全」
驗證階段的規則很多,但大致分為如下4個階段「具體詳細的內容,我就不詳細解釋了,可以看《深入理解Java虛擬機》,本篇文章偏向於做一個總結,把握類別加載的一個整體流程,而不對細節進行闡述”
準備
「準備階段主要是為類別的靜態變數分配內存,並將其初始化為默認值”
常見的資料類型的預設值如下
資料型別 | 預設值 |
---|---|
byte | # (byte)0 |
short | (short)0 |
int | #0 |
long | 0L |
float | 0.0f |
#double | 0.0d |
boolean | false |
char | '\u0000' |
#參考 | null |
「如果類別靜態變數的欄位屬性表中存在ConstantValue屬性,則直接執行賦值語句」
那麼什麼情況下類別靜態變數的欄位屬性表中存在ConstantValue屬性呢?
類別靜態變數為基本資料類型,並且被final修飾 #類別靜態變數為String類型,被final修飾,並且以字面量的形式賦值
為了方便查看Class檔案的字節碼,我在IDEA下載了一個外掛程式jclasslib Bytecode viewer,非常方便。用以下程式碼透過字節碼的形式驗證一下
public class Person { private static int age = 10; private static final int length = 160; private static final String name = "name"; private static final String loc = new String("loc"); }
「所以length和name屬性在準備階段就會賦值為ConstantValue指定的值」
#「那麼age和loc屬性會在哪個階段賦值呢?是在初始化階段,後面會詳細介紹哈」
##解析
「將類,接口,字段和方法的符號引用(在常數池中)轉為直接引用」符號引用:用一組符號來描述所引用的目標 直接引用;直接指向指向目標的指標
加入我寫了一個如下的類別public class Student { private String name; private int age; public String getName() { return this.name; } }
以欄位為例,name和age對應的物件並不是直接指向記憶體位址,而是用字串來進行描述(即符號引用)。解析階段就是將這些描述轉為直接指向目標的指標(即直接引用)
初始化
「执行类静态成员变量赋值语句和静态代码块中的语句」

我们把上面的Student代码改成如下形式
public class Student { private String name; private int age = 10; private static int gender = 1; { System.out.println("构造代码块"); } static { System.out.println("静态代码块"); } public Student() { System.out.println("构造函数"); } public String getName() { return this.name; } }
可以看到字节码中包含了3个方法,getName方法我们知道,从字节码的角度分析一波
「

从字节码可以看到
调用父类的 方法 非静态成员变量赋值 执行构造代码块 执行构造函数
「
从字节码可以看到
執行靜態變數的賦值語句 執行靜態程式碼區塊中的語句 需要注意的一點是,「Java虛擬機會保證子類別的 方法執行前,父類別的 方法已經執行完畢」
「理解
#我這裡就直接總結結論,大家可以寫demo驗證一下 - 「沒有繼承狀況的執行順序」
靜態程式碼區塊和靜態成員變量,執行順序由編寫順序決定(只會執行一次哈)
建構程式碼區塊和非靜態成員變量,執行順序由編寫順序決定 #建構子
「有繼承情況的執行順序」
需要確保堆中的Sample類別及其子類別都已經被回收 #載入Sample類別的MyClassLoader已經被回收 Sample類別對應的Class物件已經被回收
可以看到對方法區的類型資料回收的條件比較苛刻,但是收效甚微,所以有些垃圾收集器不會對方法區的類型資料進行回收
總結
類別載入過程
變數的賦值過程
以上是面試官:說一下類別載入的過程(10張圖解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。