class文件詳解之直接引用和符號引用

符號引用(class文件中)

在Java中,一個java類將會編譯成- 一個class文件。在編譯時,java類 并不知道所引用的類的實際地址,因此只能使用簽號引用來代替。

比如org. simple.People類引用了org.simple.Language類,在編譯時People類 并不知道Language類的實際內(nèi)存地址,因此只能使用符號org.simple,.Language (假設(shè)是這個,當(dāng)然實際中是由類似于,CONSTANT Class info的常量來表示的)來表示Language類的地址。

直接引用(運行時內(nèi)存中)

直接引用可以是:
1.直接指向且標(biāo)的指釷(比如,指向“類型”[Class對象] 、類變量、類方法的直接引用可能是指向方法區(qū)的指針)
2.相對偏移量(比如,指向?qū)嵗兞?、實例方法的直接引用都是偏移?
3.一個能間接定位到且標(biāo)的句柄。

直接引用是和虛擬機(jī)的布局相關(guān)的,同一個符號引用在不同的虛擬機(jī)實例上翻譯出來的直接引用一般不會相同。如果有了直接引用,那引用的目標(biāo)必定已經(jīng)被加載入內(nèi)存中了。

引用替換的時機(jī)

1、類加載的解析階段(需要將一部分符 號引用轉(zhuǎn)換為直接引用)符號引用替換為直接引用的操作發(fā)生在類加載過程(加載->連接(驗證、準(zhǔn)備、解析) ->初始化)中的解析階段,會將符號引用轉(zhuǎn)換(替換)為對應(yīng)的直接引用,放入運行時常量池中。
2、運行期間(動態(tài)分派)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容