日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解 JVM Class文件格式(六)

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解 JVM Class文件格式(六) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

經過前幾篇文章, 終于將常量池介紹完了, 之所以花這么大的功夫介紹常量池, 是因為對于理解class文件格式,常量池是必須要了解的, 因為class文件中其他地方,大量引用了常量池中的數據項。 對于還不了解常量池的讀者, 如果想要深入了解class文件格式, 或者想繼續讀這篇博客和本專欄以后的博客, 那么我建議先把我前面的幾篇博客讀一下,把常量池的結構熟悉一下, 對于理解后面的內容很有幫助。

雖然介紹完了常量池, 但是class文件中位于常量池下面的內容還有很多呢。 接下來, 我們就分析class文件中位于常量池下面的內容, 不用擔心, 只要把常量池搞明白了, 這些內容就會很容易理解。

在開始進入正文之前, 在這里再次給出class文件的整體格式。 這個表格曾出現在 深入理解Java Class文件格式(一) 這篇文章中。 之所以把這個表格列在這里, 是想再次給讀者一個class文件的總體概覽。表格的內容如下:

下面我們就開始介紹class文件中的其他內容。

class文件中的訪問標志信息

從上面的表格可以看出, 位于常量池下面的2個字節是access_flags 。 access_flags 描述的是當前類(或者接口)的訪問修飾符, 如public, private等, 此外, 這里面還存在一個標志位, 標志當前的額這個class描述的是類, 還是接口。access_flags 的信息比較簡單, 下面列出access_flags 中的各個標志位的信息。

其他標志就不做介紹了, 這些標志都很簡單。 讀者感覺比較陌生的可能是ACC_SUPER這個標志。 讀者會想, 類型不能被super關鍵字修飾啊, 那這個ACC_SUPER是做什么的呢?表中可以看出, 它的含義是:使用新的invokespecial語義 。 invokespecial是一個字節碼指令, 用于調用一個方法, 一般情況下, 調用構造方法或者使用super關鍵字顯示調用父類的方法時, 會使用這條字節碼指令。 這正是ACC_SUPER這個名字的由來。 在java 1.2之前, invokespecial對方法的調用都是靜態綁定的, 而ACC_SUPER這個標志位在java 1.2的時候加入到class文件中, 它為invokespecial這條指令增加了動態綁定的功能。 這里可能有幾個概念讀者不是很明白, 如靜態綁定, 動態綁定等, 這些概念會在以后的博客中詳細介紹。

還有一點需要說明, 既然access_flags 出現在class文件中的類的層面上, 那么它只能描述類型的修飾符, 而不能描述字段或方法的修飾符, 希望讀者不要將這里的access_flags 和后面要介紹的方法表和字段表中的訪問修飾符相混淆。

此外, 在Java 5 的中, 引入和注解和枚舉的新特性, 那么可以推測, ACC_ANNOTATION 和 ACC_ENUM是在Java 5版本中加入的。 class文件雖然總體上保持前后一致性, 但他也不是一成不變的, 也會跟著Java版本的提升而有所改變, 但是總體來說, class文件格式還是相對穩定的, 變動的地方不是很多。

class文件中的this_class

訪問標志access_flags 下面的兩個字節叫做this_class, 它是對當前類的描述。 它的兩個字節的數據是對常量池中的一個CONSTANT_Class_info數據項的一個索引。 CONSTANT_Class_info在上面的文章中已經介紹過了。 CONSTANT_Class_info中有一個字段叫做name_index , 指向一個CONSTANT_Utf8_info , 在這個CONSTANT_Utf8_info 中存放著當前類的全限定名。

如果當前類為Person:

package com.jg.zhang;public class Person {int age;int getAge(){return age;} }

將Person.class反編譯后, 可以在常量池中看到如下兩項:

Constant pool:#1 = Class #2 // com/jg/zhang/Person#2 = Utf8 com/jg/zhang/Person......... .........

這兩項就是當前類的信息。 其中索引為1的CONSTANT_Class_info會被class文件中的this_class所引用。 下面給出示例圖(其中虛線范圍內表示常量池的區域):

class文件中的super_class

super_class緊跟在this_class之后。 它和this_class一樣是一個指向常量池數據項的索引。 它指向一個CONSTANT_Class_info, 這個CONSTANT_Class_info數據項描述的是當前類的超類的信息。CONSTANT_Class_info中的name_index指向常量池中的一個CONSTANT_Utf8_info ,CONSTANT_Utf8_info 中存放的是當前類的超類的全限定名。 如果沒有顯式的繼承一個,也就是說如果當前類是直接繼承Object的, 那么super_class值為0 。 我們在前面的文章中提到過, 如果一個索引值為0, 那么就說明這個索引不引用任何常量池中的數據項, 因為常量池中的數據項是從1開始的。 也就是說, 如果一個類的class文件中的super_class為0 , 那么就代表該類直接繼承Object類。

下面以代碼來說明:

package com.jg.zhang;public class Programer extends Person{Computer computer;public Programer(Computer computer){this.computer = computer;}public void doWork(){computer.calculate();} }

上面的Programer類繼承自Person類。 那么反編譯Programer .class , 它的常量池中會存在如下信息:

Constant pool:......... .........#3 = Class #4 // com/jg/zhang/Person#4 = Utf8 com/jg/zhang/Person

這兩項就是當前類的父類的信息。 其中索引為3的CONSTANT_Class_info會被class文件中的super_class引用。 下面給出示例圖(其中虛線范圍內表示常量池的區域):

class文件中的interfaces_count和interfaces

緊接著super_class的是interfaces_count, 表示當前類所實現的接口的數量或者當前接口所繼承的超接口的數量。 注意, 只有當前類直接實現的接口才會被統計, 如果當前類繼承了另一個類, 而另一個類又實現了一個接口, 那么這個接口不會統計在當前類的interfaces_count中。 在interfaces_count后面是interfaces, 他可以看做是一個數組, 其中的每個數組項是一個索引, 指向常量池中的一個CONSTANT_Class_info, 這個CONSTANT_Class_info又會引用常量池中的一個CONSTANT_Utf8_info , 這個CONSTANT_Utf8_info 中存放著有當前類型直接實現或繼承的接口的全限定名。 當前類型實現或繼承了幾個接口, 在interfaces數組中就會有幾個數項與之相對應。

下面看代碼示例:

package com.jg.zhang;public class Plane implements IFlyable, Cloneable{@Overridepublic void fly() {} }

Plane類實現了一個自定義的IFlyable接口, 還實現了一個JDK中的Cloneable接口, 那么它的常量池中會有如下信息:

Constant pool:......... .........#5 = Class #6 // com/jg/zhang/IFlyable#6 = Utf8 com/jg/zhang/IFlyable#7 = Class #8 // java/lang/Cloneable#8 = Utf8 java/lang/Cloneable......... .........

這四項數據就是當前的Plane類所實現的接口的信息。 第五項和第六項描述了Plane所實現的IFlyable接口, 第七項和第八項描述了Plane所實現的接口Cloneable接口。 下面是示意圖(其中虛線范圍內表示常量池的區域):

總結

在本篇博客中, 繼續講解了class文件中常量池以下的部分。 主要講解了三個部分, 分別是this_class , super_class , interfaces_count和interfaces 。 這三個數據項分別描述了當前類(就是當前class文件所在的類), 當前類所繼承的超類, 和當前類所實現的接口(如果當前class文件代表的是一個接口, 那么 interfaces_count和interfaces描述的是當前接口所繼承的超接口)。

這幾個數據項都持有指向常量池的索引。 真實的信息都是存放在常量池中的, 只不過常量池中的這些信息會被this_class , super_class , interfaces_count和interfaces 引用。

通過本篇博客我們可以知道源文件中的當前類, 當前類的超類以及當前類的超接口在class文件中是如何被描述的。 在下一篇博客中, 將會講解源文件中的定義的字段, 聲明的方法在class文件中是如何描述的。

總結

以上是生活随笔為你收集整理的深入理解 JVM Class文件格式(六)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97人人爽人人 | 欧美日韩黄 | bangbros性欧美18 | 国产精品 欧美精品 | 亚洲色图88 | 久久国产视频网站 | 91免费网站 | 少女情窦初开的第4集在线观看 | 动漫女生光屁股 | 中文字幕在线看 | 91精品在线一区 | 中文字幕在线高清 | 九九99视频| 亚洲熟伦熟女新五十路熟妇 | 西西毛片| 在线免费观看的av | 特大黑人娇小亚洲女mp4 | 亚洲欧美日韩精品在线观看 | 黄色xxxxx | 久久久久久婷 | 亚洲精品www久久久久久广东 | 国产欧美一区二区在线观看 | 欧美日韩在线二区 | 一区二区三区四区在线观看视频 | 在线免费看mv的网站入口 | 国产精品久久久久久久久久久久久久久久久久 | 日本三级韩国三级三级a级中文 | 日韩精品啪啪 | 亚洲xx站| 国产suv精品一区二区33 | 国产在线视频网址 | 人人妻人人澡人人爽精品欧美一区 | 国产精品一区二区6 | 久久日韩精品 | 制服诱惑一区 | 99精品视频国产 | 日日淫 | 夜夜狠狠擅视频 | 欧美影视一区 | 美女黄色一级视频 | 高清国产mv在线观看 | 亚洲嫩草影院 | 美女扒开尿口让男人桶 | 国产美女三级无套内谢 | 色播在线播放 | 黄色电影在线视频 | 国产又大又粗又长 | 成人在线观看18 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 豆花视频在线 | 亚洲激情第一页 | 国产人妖一区二区三区 | 欧美乱子伦 | 性爱一级视频 | 美女av免费观看 | 国模少妇一区二区三区 | 国产二区视频在线观看 | 99久久视频| 国产一区二区三区中文字幕 | 久久久精品在线 | 性感美女一区二区三区 | 美女脱光内衣内裤 | 久色视频在线播放 | 日韩va在线 | 思思99re| 国产成人无码a区在线观看视频 | 蜜臀在线一区二区三区 | 国产高潮久久 | 成人黄色短片 | 国内少妇精品 | 久久久久久久久久99精品 | 亚洲自拍偷拍一区 | 夜夜操操 | 91国内精品野花午夜精品 | 91久久久久 | 国产一区二区视频在线观看免费 | www.在线观看网站 | 亚洲涩色 | 学生孕妇videosex性欧美 | 中文字幕一区2区3区 | 少妇一区二区三区四区 | 色偷偷人人澡人人爽人人模 | 最新国产网址 | 免费不卡的av | 国产精品无码在线播放 | 亚洲第一天堂 | 中文字幕第7页 | aaa一区二区三区 | 久久婷婷综合色 | 欧美一级特黄视频 | 激情婷婷综合网 | 古代玷污糟蹋np高辣h文 | 日本黄色不卡 | 色乱码一区二区三区在线男奴 | 久久超碰精品 | 亚洲va欧美va天堂v国产综合 | 国产激情网 | 大屁股白浆一区二区三区 | 日韩黄色录像 |