教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

類的加載機(jī)制是什么?【Java面試題】

更新時間:2021年06月21日10時08分 來源:傳智教育 瀏覽次數(shù):

傳智教育-一樣的教育,不一樣的品質(zhì)

(1)問題分析:

Class文件由類裝載器裝載后,在JVM中將形成一份描述Class結(jié)構(gòu)的元信息對象,通過該元信息對象可以獲知Class的結(jié)構(gòu)信息:如構(gòu)造函數(shù),屬性和方法等,Java允許用戶借由這個Class相關(guān)的元信息對象間接調(diào)用Class對象的功能。

虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗,轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。

(2)核心答案講解:

類裝載器就是尋找類的字節(jié)碼文件,并構(gòu)造出類在JVM內(nèi)部表示的對象組件。在Java中,類裝載器把一個類裝入JVM中,要經(jīng)過以下步驟:

1)裝載:查找和導(dǎo)入Class文件;

2)鏈接:把類的二進(jìn)制數(shù)據(jù)合并到JRE中;

A)校驗:檢查載入Class文件數(shù)據(jù)的正確性;

B)準(zhǔn)備:給類的靜態(tài)變量分配存儲空間;

C)解析:將符號引用轉(zhuǎn)成直接引用;

3)初始化:對類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作

Java程序可以動態(tài)擴(kuò)展是由運行期動態(tài)加載和動態(tài)鏈接實現(xiàn)的;比如:如果編寫一個使用接口的應(yīng)用程序,可以等到運行時再指定其實際的實現(xiàn)(多態(tài)),解析過程有時候還可以在初始化之后執(zhí)行;比如:動態(tài)綁定(多態(tài))。

(3)問題擴(kuò)展

由于Java的跨平臺性,經(jīng)過編譯的Java源程序并不是一個可執(zhí)行程序,而是一個或多個類文件。當(dāng)Java程序需要使用某個類時,JVM會確保這個類已經(jīng)被加載、連接(驗證、準(zhǔn)備和解析)和初始化。類的加載是指把類的.class文件中的數(shù)據(jù)讀入到內(nèi)存中,通常是創(chuàng)建一個字節(jié)數(shù)組讀入.class文件,然后產(chǎn)生與所加載類對應(yīng)的Class對象。加載完成后,Class對象還不完整,所以此時的類還不可用。當(dāng)類被加載后就進(jìn)入連接階段,這一階段包括驗證、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號引用替換為直接引用)三個步驟。最后JVM對類進(jìn)行初始化,包括:1)如果類存在直接的父類并且這個類還沒有被初始化,那么就先初始化父類;2)如果類中存在初始化語句,就依次執(zhí)行這些初始化語句。

類的加載是由類加載器完成的,類加載器包括:根加載器(BootStrap)、擴(kuò)展加載器(Extension)、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)?!?/p>

(4)結(jié)合項目中的使用





猜你喜歡:

使用static關(guān)鍵字如何定義成員變量?

JVM將內(nèi)存空間劃分為幾種?【Java面試題】

JVM對Java的原生鎖做了哪些優(yōu)化?

傳智教育Java高級軟件工程師培訓(xùn)

0 分享到:
和我們在線交談!