全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Java類(lèi)加載機(jī)制詳解【java面試題】

更新時(shí)間:2020-09-29 來(lái)源:黑馬程序員 瀏覽量:

(1)問(wèn)題分析:

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

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

(2)核心答案講解:

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

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

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

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

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

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

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

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

(3)問(wèn)題擴(kuò)展

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

類(lèi)的加載是由類(lèi)加載器完成的,類(lèi)加載器包括:根加載器(BootStrap)、擴(kuò)展加載器(Extension)、系統(tǒng)加載器(System)和用戶(hù)自定義類(lèi)加載器(java.lang.ClassLoader的子類(lèi))。


猜你喜歡:

Java異常處理機(jī)制的原理和應(yīng)用 

單例模式介紹:懶漢和餓漢代碼

java類(lèi)加載器詳細(xì)視頻教程 

java有幾種類(lèi)加載器?工作原理是什么? 

Java高級(jí)軟件工程師課程 



分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!