0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM入門之Class結(jié)構(gòu)介紹2

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-09 16:57 ? 次閱讀

access_flags訪問標(biāo)識

常量池結(jié)束后就是這個Class對應(yīng)的訪問標(biāo)志內(nèi)容,用u2(兩個字節(jié))來表示。

?訪問標(biāo)志可以有多個,根據(jù)多個標(biāo)志位的或運算來決定最終的access_flags的取值

?

class的繼承實現(xiàn)關(guān)系

訪問標(biāo)志之后的是this_class,super_class,interfaces_count,interfaces這些數(shù)據(jù)。1.this_class:該Class的權(quán)限定名。( 「通過訪問常量池中的類信息表來定位到類的權(quán)限定名」2.super_class:父類的全限定名。(由于Java中是 「單繼承多實現(xiàn)」 的,所以父類索引只有一個,但是接口可以有多個稍后將),跟上面的尋找過程類似,只不過換了一個常量池的索引,「如果沒有顯示使用繼承的話那么最終引用的是Object類的權(quán)限定名,如果明確使用了繼承自哪個類那么最終引用到的就是那個類的權(quán)限定名」3.interfaces和interfaces_count 剛剛說了Class是可以多實現(xiàn)的,所以

interfaces_count為 「該Class實現(xiàn)接口的數(shù)量」 (如果沒有任何實現(xiàn)的接口,那么該值為0后面的interfaces將沒有數(shù)據(jù)不占用任何字節(jié));

interfaces為實現(xiàn)接口的對應(yīng)接口的全限定名

字段表

「該表結(jié)構(gòu)用于描述接口/類中聲明的變量」

變量可以分為類變量(static級別的),實例變量。

?注意:該部分不包括方法中的局部變量字段,局部變量會有一個單獨的局部變量表來存儲,下一篇文章講解。對于Class文件中最外層的字段表中存儲的只是類變量和實例變量。

?

而字段有哪些數(shù)據(jù)需要表示呢?權(quán)限修飾符,字段名稱,字段數(shù)據(jù)類型,類級別還是實例級別(是否有static修飾符),可變性(final),并發(fā)可見性(volatile修飾符,強制從主內(nèi)存讀寫),是否可以被序列化(transient修飾符)

access_flags訪問標(biāo)識

這個訪問標(biāo)識和前面講的類的access_flags不一樣,這個是字段的訪問標(biāo)識

名稱索引和描述符的索引

這兩個索引都是在常量池中的索引,對常量池的引用

name_index為 「字段的名稱」 descriptor_index為描述符,對應(yīng)于字段來說是該**「字段的數(shù)據(jù)類型」**

描述符的含義:

?對于一維數(shù)組來說使用“[”來表示,如果是二位就用兩個“[[”。比如類型為String的二維數(shù)組(String[][])用描述符來表示就是[[ java.lang.String;一維數(shù)組“int[]”就是[I

?

存儲額外信息

可以看到描述符后面還有一個屬性表集合,該集合是用來**「存儲一些額外的信息,可以添加0到多個信息。」**

如果沒有額外描述的信息attributes_count就是0,后面沒有字節(jié)去描述屬性表;如果有額外的信息比如將字段聲明為final的話,屬性表中就會存儲一個ConstantValue的屬性,這個值指向?qū)?yīng)的常量值。(關(guān)于這部分內(nèi)容之后進(jìn)行詳解)

?該字段表中不會記錄父類中或者父接口中繼承來的字段,但是有可能出現(xiàn)原本不存在的字段,比如在內(nèi)部類中添加字段來訪問外部類。

?

?重載字段:對于Class文件來說剛剛看了,只要描述符不一致,字段名一樣也是可以被記錄到Class中的而不會引起沖突;但是對于Java語言來說字段是不能重載的,不管描述符一樣不一樣,「名稱必須不一樣?。。 ?/strong>

?

方法表

「該表結(jié)構(gòu)用于描述接口/類中聲明的變量」

「圖例:」

可以看到和上面講的字段表結(jié)構(gòu)大致是一樣的。

access_flags訪問標(biāo)識

名稱索引和描述符的索引

這兩個索引都是在常量池中的索引,對常量池的引用

name_index為 「方法的名稱」 descriptor_index為描述符,對應(yīng)于方法來說是該 「方法的參數(shù)集合和返回值類型」 對應(yīng)的數(shù)據(jù)在上面講字段表的時候已經(jīng)貼過圖,不在說明。

存儲額外信息

這個里面的屬性表中就會有各種各樣的表來存儲一個方法的額外信息,比如方法體中的代碼,局部變量表等等表結(jié)構(gòu)數(shù)據(jù)類型。(下一篇文章進(jìn)行詳解)

?和字段表一樣如果父類方法沒有被子類重寫,那么該表中不會記錄父類方法的信息的,但是同樣可以出現(xiàn)一些編譯器添加的方法,比如類構(gòu)造器clvinit()和實例構(gòu)造器init()

?

?重載方法:名稱一樣,方法的特征簽名不一樣。對于Class文件來說方法的特征簽名不同(描述符不完全一致)就可以進(jìn)行重載不會發(fā)生沖突;但是對于Java語言來說方法的特征簽名中不包括返回值這個條件所以返回值不同不能作為重載的條件 Java代碼層面的方法特征簽名,Java代碼的方法特征簽名只包括方法名稱、參數(shù)順序及參數(shù)類型,而字節(jié)碼Class的特征簽名還包括方法返回值以及受查異常表,請讀者根據(jù)上下文語境注意區(qū)分。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104110
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134165
  • Class
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    19676
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    12168
收藏 人收藏

    評論

    相關(guān)推薦

    jvm的類加載器的整體結(jié)構(gòu)及過程解析

    前言 我們很多小伙伴平時都是做JAVA開發(fā)的,那么作為一名合格的工程師,你是否有仔細(xì)的思考過JVM的運行原理呢。 如果懂得了JVM的運行原理和內(nèi)存模型,像是一些JVM調(diào)優(yōu)、垃圾回收機制等等的問題我們
    的頭像 發(fā)表于 09-27 15:49 ?3333次閱讀
    <b class='flag-5'>jvm</b>的類加載器的整體<b class='flag-5'>結(jié)構(gòu)</b>及過程解析

    Proteus基礎(chǔ)入門教程 Proteus界面功能介紹及常用操作

    Proteus基礎(chǔ)入門教程 Proteus界面功能介紹及常用操作
    發(fā)表于 09-27 22:35

    JavaWeb入門響應(yīng)的結(jié)構(gòu)

    JavaWeb入門—響應(yīng)的結(jié)構(gòu)
    發(fā)表于 05-15 06:00

    Jvm的整體結(jié)構(gòu)和特點

    的整體結(jié)構(gòu)大致如下:    1、類加載器  類加載器用來加載Java類到JVM虛擬機中,源代碼程序.java文件在經(jīng)過編譯器編譯之后就被轉(zhuǎn)換成字節(jié)代碼.class文件,類加載器負(fù)責(zé)讀取字節(jié)代碼,并轉(zhuǎn)
    發(fā)表于 01-05 17:23

    Jvm工作原理學(xué)習(xí)筆記

    [] args)函數(shù)的class都可以作為JVM實例運行的起點 b) 運行。main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護
    發(fā)表于 04-03 11:03 ?5次下載

    Java:JVM虛擬機的入門知識

    Java開發(fā)現(xiàn)在面試越來越難了,進(jìn)大廠必備的JVM、多線程高并發(fā)這都是最基礎(chǔ)的知識了,今天我們一起來學(xué)習(xí)Java虛擬機入門。
    的頭像 發(fā)表于 07-01 11:43 ?2229次閱讀
    Java:<b class='flag-5'>JVM</b>虛擬機的<b class='flag-5'>入門</b>知識

    JVM入門Class結(jié)構(gòu)介紹1

    ?根據(jù)《JAVA虛擬機規(guī)范》的規(guī)定,Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲數(shù)據(jù),這種偽結(jié)構(gòu)中(Class文件格式中)只有
    的頭像 發(fā)表于 02-09 16:57 ?524次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>介紹</b>1

    JVM入門Class結(jié)構(gòu)屬性表1

    ?屬性表在《JAVA虛擬機規(guī)范》中并沒有像其他數(shù)據(jù)一樣做嚴(yán)格的限制,我們甚至可以自己實現(xiàn)一個編譯器往Class結(jié)構(gòu)的屬性表中注入額外的屬性信息,虛擬機運行時會忽略掉它識別不了的屬性。
    的頭像 發(fā)表于 02-10 11:02 ?486次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b>屬性表1

    JVM入門Class結(jié)構(gòu)屬性表2

    ?屬性表在《JAVA虛擬機規(guī)范》中并沒有像其他數(shù)據(jù)一樣做嚴(yán)格的限制,我們甚至可以自己實現(xiàn)一個編譯器往Class結(jié)構(gòu)的屬性表中注入額外的屬性信息,虛擬機運行時會忽略掉它識別不了的屬性。
    的頭像 發(fā)表于 02-10 11:02 ?468次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b>屬性表<b class='flag-5'>2</b>

    USB Class介紹

    電子發(fā)燒友網(wǎng)站提供《USB Class介紹.pdf》資料免費下載
    發(fā)表于 08-01 16:19 ?0次下載
    USB <b class='flag-5'>Class</b>的<b class='flag-5'>介紹</b>

    垃圾收集器的JVM參數(shù)配置

    本篇文章我們就來給大家介紹垃圾收集器的 JVM 參數(shù)配置。 JVM參數(shù)有很多,其實我們直接使用默認(rèn)的JVM參數(shù),不去修改都可以滿足大多數(shù)情況。但是如果你想在有限的硬件資源下,部署的系統(tǒng)
    的頭像 發(fā)表于 10-09 16:35 ?461次閱讀
    垃圾收集器的<b class='flag-5'>JVM</b>參數(shù)配置

    jvm內(nèi)存溢出該如何定位解決

    超出限制和堆空間不足。 定位JVM內(nèi)存溢出問題是一個比較復(fù)雜的任務(wù),需要結(jié)合工具和技術(shù)來進(jìn)行分析和解決。本文將介紹一些常用的調(diào)試和解決內(nèi)存溢出問題的工具和技術(shù)。 一、理解JVM內(nèi)存結(jié)構(gòu)
    的頭像 發(fā)表于 12-05 11:05 ?1133次閱讀

    jvm內(nèi)存模型和內(nèi)存結(jié)構(gòu)

    JVM(Java虛擬機)是Java程序的運行平臺,它負(fù)責(zé)將Java程序轉(zhuǎn)換成機器碼并在計算機上執(zhí)行。在JVM中,內(nèi)存模型和內(nèi)存結(jié)構(gòu)是兩個重要的概念,本文將詳細(xì)介紹它們。 一、
    的頭像 發(fā)表于 12-05 11:08 ?736次閱讀

    jvm調(diào)優(yōu)參數(shù)

    和類元數(shù)據(jù)等方面的參數(shù)設(shè)置。下面我們將詳細(xì)介紹這些參數(shù)以及如何進(jìn)行優(yōu)化。 首先,堆內(nèi)存是JVM中用于存放對象實例的內(nèi)存區(qū)域。通過調(diào)整堆內(nèi)存的大小,我們可以控制應(yīng)用程序?qū)?nèi)存資源的使用。JVM的堆內(nèi)存包括新生代和老年代兩部分。新生
    的頭像 發(fā)表于 12-05 11:29 ?520次閱讀

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    JVM(Java虛擬機)參數(shù)的設(shè)置和調(diào)優(yōu)對于提高Java應(yīng)用程序的性能和穩(wěn)定性非常重要。在本文中,我們將詳細(xì)介紹JVM參數(shù)的設(shè)置和調(diào)優(yōu)方法。 一、JVM參數(shù)的設(shè)置 內(nèi)存參數(shù): -Xms
    的頭像 發(fā)表于 12-05 11:36 ?1048次閱讀