欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

Java類文件結(jié)構(gòu)

Java虛擬機(jī)不和包括Java在內(nèi)的任何語言綁定,只與 "Class文件" 這種特定的二進(jìn)制文件所關(guān)聯(lián), Class文件中包含了Java虛擬機(jī) 指令集合符號(hào)表 以及若干其它輔助信息。 Java虛擬機(jī)作為一個(gè)通用的、機(jī)器無關(guān)的執(zhí)行平臺(tái),任何其他語言都可以將其作為語言的產(chǎn)品交付媒介。

10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有紫金免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

Class類文件結(jié)構(gòu)

Class文件是一組以8位字節(jié)為基礎(chǔ)的 二進(jìn)制流 , 各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格按照順序緊湊地排列在Class文件之中,中間沒有添加任何分隔符, 這使得整個(gè)Class文件中存儲(chǔ)的內(nèi)容幾乎全部是程序運(yùn)行的必要數(shù)據(jù),沒有空隙存在。 當(dāng)遇到需要占用8位字節(jié)以上空間的數(shù)據(jù)項(xiàng)時(shí),則會(huì)按照 高位在前 的方式分割成若干個(gè)8位字節(jié)進(jìn)行存儲(chǔ)。

Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲(chǔ)數(shù),這種偽結(jié)構(gòu)有兩種數(shù)據(jù)類型:

無符號(hào)數(shù)

無符號(hào)數(shù):屬于基本數(shù)據(jù)類型,以u(píng)1、u2、u4、u8來代表1個(gè)字節(jié)、2個(gè)字節(jié)、4個(gè)字節(jié)、8個(gè)字節(jié)的無符號(hào)數(shù), 無符號(hào)數(shù)可以用來描述數(shù)字、索引引用、數(shù)量值或者按照UTF-8編碼構(gòu)成字符串值。

表:由多個(gè)無符號(hào)數(shù)或者其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的復(fù)合數(shù)據(jù)類型,所有表都習(xí)慣性地以"_info"結(jié)尾。 表用于描述有層次關(guān)系的復(fù)合結(jié)構(gòu)的數(shù)據(jù),整個(gè)Class文件本質(zhì)上就是一張表。

  • 注意:Class文件結(jié)構(gòu)不像XML等描述語言,由于它沒有任何分割符號(hào), 所以無論是數(shù)量甚至于數(shù)據(jù)存儲(chǔ)的字節(jié)序這樣的細(xì)節(jié)都被嚴(yán)格限定, 哪個(gè)字節(jié)代表什么含義,長(zhǎng)度是多少,先后順序如何,都不允許改變。

魔數(shù)與Class文件版本

每個(gè)Class文件的頭四個(gè)字節(jié)稱為魔數(shù)(Magic Number), 它的唯一作用是 確定這個(gè)文件是否為一個(gè)能被虛擬機(jī)接收的Class文件 。 緊接著魔數(shù)的四個(gè)字節(jié)存儲(chǔ)的是Class文件的版本號(hào): 第五和第六是次版本號(hào),第七和第八是主版本號(hào)。

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

常量池

緊接著主次版本號(hào)之后的是常量池入口, 常量池可以理解為Class文件之中的資源倉庫 , 它是Class文件結(jié)構(gòu)中與其他項(xiàng)目關(guān)聯(lián)最多的數(shù)據(jù)類型,也是占用Class文件空間最大的數(shù)據(jù)項(xiàng)目之一, 同時(shí)它還是在Class文件中第一個(gè)出現(xiàn)的表類型數(shù)據(jù)項(xiàng)目。 常量池主要存放兩大常量: 字面量 和 符號(hào)引用 。 字面量比較接近于java語言層面的的常量概念,如文本字符串、聲明為final的常量值等。 而符號(hào)引用則屬于 編譯原理方面的概念 。包括下面三類常量:

  • 類和接口的全限定名

  • 字段的名稱和描述符

  • 方法的名稱和描述符

由于常量池中常量的數(shù)量是不固定的,所以在常量池的入口需要設(shè)置一項(xiàng)u2類型的數(shù)據(jù),代表常量池容量計(jì)數(shù)值。 與Java中語言習(xí)慣不一樣的是,這個(gè)容量技術(shù)是從1而不是0開始的,如下圖表示,常量池容量(偏移地址:0x00000008)

為十六進(jìn)制數(shù)0x0016,即十進(jìn)制22,這代表常量池中有21項(xiàng)常量,索引值范圍為1~21。在Class文件格式規(guī)范制定之時(shí),設(shè)計(jì)者將第0項(xiàng)常量空出來是有特殊考慮的,這樣做的目的在于 滿足后面某些指向常量池的索引值的數(shù)據(jù)在特定情況下需要表達(dá)

"不引用任何一個(gè)常量池項(xiàng)目"的含義,這種情況就可以把索引值置為0來表示。  Class文件結(jié)構(gòu)中只有常量池的容量計(jì)數(shù)從1開始 , 對(duì)于其他集合類型,包括接口索引結(jié)合,字段表集合,方法表集合等容量技術(shù)都與一般習(xí)慣相同,從0開始。

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

訪問標(biāo)志

在常量池結(jié)束之后,緊接著的兩個(gè)字節(jié)代表訪問標(biāo)志, 這個(gè)標(biāo)志用于識(shí)別一些類或者接口層次的訪問信息, 包括:這個(gè)Class是類還是接口,是否為public或者abstract類型,如果是類的話是否聲明為final等等。 標(biāo)志位和標(biāo)志的含義對(duì)應(yīng)如下:

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

類索引、父類索引與接口索引集合

類索引、父類索引與接口索引集合都按順序排列在訪問標(biāo)志之后, Class文件由這三項(xiàng)數(shù)據(jù)來確定這個(gè) 類的繼承關(guān)系 。 類索引用于確定 這個(gè)類的全限定名 , 父類索引用于確定 這個(gè)類的父類的全限定名 ,由于java語言的單繼承,所以父類索引只有一個(gè), 除了java.lang.Object之外,所有的java類都有父類,因此除了java.lang.Object外,所有java類的父類索引都不為0。 接口索引集合用來描述 這個(gè)類實(shí)現(xiàn)了哪些接口 ,這些被實(shí)現(xiàn)的接口將按 implents(如果這個(gè)類本身是接口的話則是extends)后的接口順序從左到右排列在 接口索引集合中。

字段表集合

字段表(field info)用于描述接口或類中聲明的變量。 字段包括 類變量 和 實(shí)例變量 ,但不包括在方法內(nèi)部聲明的局部變量。

我們可以想一想在Java中描述一個(gè)字段可以包含什么信息呢?

字段的作用域(public ,private,protected修飾符),是實(shí)例變量還是類變量(static修飾符)、 可變性(final)、并發(fā)可見性(volatile修飾符,是否強(qiáng)制從主內(nèi)存讀寫)、可否被序列化(transient修飾符)、 字段數(shù)據(jù)類型、字段名稱。

上述這些信息中,各個(gè)修飾符都是布爾值,要么有某個(gè)修飾符,要么沒有,很適合使用標(biāo)志位來表示。 而字段叫什么名字、字段被定義為什么數(shù)據(jù)類型這些都是無法固定的,只能引用常量池中常量來描述。

方法表集合

Class文件存儲(chǔ)格式中對(duì)方法的描述與對(duì)字段的描述幾乎采用了完全一致的方式。 方法表的結(jié)構(gòu)如同字段表一樣,依次包括了訪問標(biāo)志、名稱索引、描述符索引、屬性表集合幾項(xiàng)。

  • 注意:因?yàn)関olatile修飾符和transient修飾符不可以修飾方法, 所以方法表的訪問標(biāo)志中沒有這兩個(gè)對(duì)應(yīng)的標(biāo)志,但是增加了synchronized、native、abstract等關(guān)鍵字修飾方法, 所以也就多了這些關(guān)鍵字對(duì)應(yīng)的標(biāo)志。

屬性表集合

在Class文件, 字段表,方法表中都可以攜帶自己的屬性表集合 ,以用于描述某些場(chǎng)景專有的信息。 與Class文件中其它的數(shù)據(jù)項(xiàng)目要求的順序、長(zhǎng)度和內(nèi)容不同,屬性表集合的限制稍微寬松一些, 不再要求各個(gè)屬性表具有嚴(yán)格的順序,并且只要不與已有的屬性名重復(fù), 任何人實(shí)現(xiàn)的編譯器都可以向?qū)傩员碇袑懭胱约憾x的屬性信息,Java虛擬機(jī)運(yùn)行時(shí)會(huì)忽略掉它不認(rèn)識(shí)的屬性。

字節(jié)碼指令簡(jiǎn)介

字節(jié)碼與數(shù)據(jù)類型

在java虛擬機(jī)的指令集中,大多數(shù)的指令都包含了其操作所對(duì)應(yīng)的數(shù)據(jù)類型信息, 例如iload指令用于從局部變量表中加載int類型的數(shù)據(jù)到操作數(shù)棧中,而fload指令加載的則是float類型的數(shù)據(jù)。 這兩條指令的操作在虛擬機(jī)內(nèi)部可能是同一段代碼實(shí)現(xiàn)的,但在Class文件中它們必須擁有各自獨(dú)立的操作碼。

大部分的指令都沒有支持整數(shù)類型byte、char、short甚至沒有任何指令支持boolean類型。 大多數(shù)對(duì)于byte、char、short、boolean類型的操作, 實(shí)際上都是使用相應(yīng)的int類型作為運(yùn)算符類型 。

加載和存儲(chǔ)指令

加載和存儲(chǔ)指令用于將數(shù)據(jù)在棧幀中的 局部變量表 和 操作數(shù)棧 之間來回傳輸。

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

運(yùn)算指令

運(yùn)算或算術(shù)指令用于對(duì)操作數(shù)棧上的值進(jìn)行某種特定運(yùn)算,并把結(jié)果重新存入操作棧頂。

大體上算術(shù)指令可以分為兩種: 對(duì) 整型數(shù)據(jù) 和對(duì) 浮點(diǎn)數(shù)據(jù) 進(jìn)行運(yùn)算指令。 (由于沒有byte、char、short、boolean類型,所以對(duì)這類數(shù)據(jù)的運(yùn)算應(yīng)使用int類型指令代替)

類型轉(zhuǎn)換指令

類型轉(zhuǎn)換指令可以將兩種不同的數(shù)值類型進(jìn)行相互轉(zhuǎn)換。 (比如int類型轉(zhuǎn)換為float類型)  小范圍到大范圍類型安全轉(zhuǎn)換 ,無需顯式的轉(zhuǎn)換指令,否則必須顯式的使用轉(zhuǎn)換指令來完成。

對(duì)象創(chuàng)建與訪問指令

雖然類實(shí)例和數(shù)組都是對(duì)象,但java虛擬機(jī)對(duì)類實(shí)例和數(shù)組的創(chuàng)建和操作使用了不同的字節(jié)碼指令。

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

操作數(shù)棧管理指令

如同操作數(shù)據(jù)結(jié)構(gòu)中的棧一樣,Java虛擬機(jī)也提供了一些用于直接操作操作數(shù)棧的指令。

Java虛擬機(jī),類文件結(jié)構(gòu)深度解析

 

控制轉(zhuǎn)移指令

可以認(rèn)為控制轉(zhuǎn)移指令就是在有條件或無條件地修改PC寄存器的值。

方法調(diào)用和返回指令

invokevirtual 指令用于調(diào)用對(duì)象的實(shí)例方法
invokeinterface 指令用于調(diào)用接口方法
invokespecial 指令用于調(diào)用一些需要特殊處理的實(shí)例方法
invokestatic 指令用于調(diào)用類方法(static方法)
invokedynamic 指令用于在運(yùn)行時(shí)動(dòng)態(tài)解析出調(diào)用點(diǎn)限定符所使用的方法。

方法調(diào)用指令與數(shù)據(jù)類型無關(guān),而方法返回指令是根據(jù)返回值的類型區(qū)分的。

異常處理指令

在java虛擬機(jī)中,處理異常(catch語句)不是由字節(jié)碼指令來實(shí)現(xiàn)的,而是采用 異常表 的方式。

同步指令

java虛擬機(jī)可以支持方法級(jí)的同步和方法內(nèi)部一段指令序列的同步,這兩種同步結(jié)構(gòu)使用管程(Monitor)來支持的。

虛擬機(jī)實(shí)現(xiàn)的兩種方式

方式一

將輸入的Java虛擬機(jī)代碼在加載或執(zhí)行時(shí)翻譯成另外一種虛擬機(jī)的指令集。

方式二

將輸入的Java虛擬機(jī)代碼在加載或執(zhí)行時(shí)翻譯成宿主主機(jī)CPU的本地指令集。(即JIT代碼生成技術(shù))

Class文件結(jié)構(gòu)的發(fā)展

Class文件結(jié)構(gòu)已經(jīng)有十多年歷史了,這10多年間,java技術(shù)體系有了翻天覆地的變化,但是Class文件結(jié)構(gòu)一直處于比較穩(wěn)定的狀態(tài),Class文件的主體結(jié)構(gòu)、字節(jié)碼指令的語義和數(shù)量幾乎沒有出現(xiàn)過變動(dòng), 所有Class文件格式的改進(jìn),都集中在向 訪問標(biāo)志 、 屬性表 這些在設(shè)計(jì)上就可擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)中添加內(nèi)容。

名稱欄目:Java虛擬機(jī),類文件結(jié)構(gòu)深度解析
路徑分享:http://aaarwkj.com/article16/gjdjgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、App設(shè)計(jì)、自適應(yīng)網(wǎng)站、靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
男女性情视频免费大全网站| 久久婷婷国产综合色啪| 日韩欧美亚洲一级黄片| 日韩欧美国产综合第一页| 日韩电影在线一本二本三本| 91亚洲蜜桃内射后入在线观看| 肥胖老熟女一区二区三区| 亚洲日本韩国福利久久| 欧美日韩国产精品综合| 国一区二区三区四区av| 欧美久久久久久久黑人| 丰满少妇一级淫片在线播放| 在线播放精品免费不卡| av永久免费观看网站| 欧美日韩一区二区三区四区在线观看| 国产欧美一区二区另类精品| 婷婷色综合一区二区三区| 亚洲狠狠爱一区二区三区| 久久精品一品二品三品| 国产91日韩欧美在线| 丰满少妇亚洲中文字幕| 国产亚洲av麻豆精品推荐| 日韩精品国产一区二区在线观看| 91久久福利国产成人精品| 欧美一区二区三区免费精品| 日本岛国大片在线视频| 欧美视频亚洲视频自拍视频 | 国产精品自产在线观看一| 蜜臀国产综合久久第一页| 免费观看国产性生活片| 男人天堂av一区二区| va精品人妻一区二区三区| 久久精品成人无码观看56| 蜜桃少妇人妻一区二区视频| 在线中文字幕日韩精品| 国产无套内射三级视频| 日韩一级免费高清黄片| 日韩欧美人妻一二三四区| 久久精品91久久久| 国产视频在线一区二区| 欧美伊人色综合久久天天|