亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Class類文件結構淺析

2019-11-11 04:52:35
字體:
來源:轉載
供稿:網友
前言      class文件時java虛擬機執行引擎的數據入口,也是java技術體系的基礎支柱之一,了解class文件的結構對后面進一步了解虛擬機執行引擎有很重要的意義。概要:    class文件是一組以八位字節為基礎單位的二進制流,各個數據項目嚴格按照順序緊湊地排列在class文件中,中間沒有添加任何分隔符,這使得整個class文件中存儲的內容幾乎全部都是程序運行的必要數據,沒有空隙存在。當需要占用8位字節以上的空間數據時,則會按照高位在前的方式分割成若干個8位字節進行存儲。class文件結構介紹:    根據java虛擬機規范的規定,class文件格式采用一種類似c語言結構體的偽結構來存儲,這種偽結構中只有兩種數據類型:無符號數和表無符號數:無符號數屬于基本的數據類型,以u1,u2,u4,u8來分別代表1個字節,2個字節,4個字節和8個字節的無符號數,無符號數可以用來描述數字、索引引用、數量值,或者按照utf-8編碼構成字符串值。表:表是由多個無符號數或者其他表作為數據項構成的復合數據類型,所有表都習慣性地以“_info“結尾。表用于描述有層次關系的復合結構的數據,整個class文件本質上就是一張表,它由下列數據項構成:[java] view plaincopy在CODE上查看代碼片ClassFile {      u4 magic;//魔數(0xCAFEBABE)      u2 minor_version;//次版本號      u2 major_version;//主版本號      u2 constant_pool_count;//常量池容量計數值      cp_info constant_pool[constant_pool_count-1];//常量池      u2 access_flags;//訪問標志      u2 this_class;//類索引      u2 super_class;//父類索引      u2 interfaces_count;//接口無論是無符號數還是表,當需要描述的同一類型但是數量不定的多個數據時,經常會使用一個前置的容量計數器加若干個連續的數據項的形式(比如說一個類可能實現了多個接口,這時候需要一個計數器來指定接口的數量),這時候稱這一系列連續的某一類型的數據為某一類型的集合。上面的文件格式是固定的,每個數據項的順序,占用字節數都是被嚴格限定的,不允許改變。下面依次介紹每個數據項的含義:1.魔數:class文件頭四個字節代表魔數,它的作用是用于確定該文件是一個能被虛擬機接受的class文件,其值為0xCAFEBABE.2.版本:魔數后四個字節代表class文件的版本號,其中前兩個字節代表次版本號,后兩個字節代表主版本號。高版本的jdk能向下兼容以前版本的class文件,但不能運行以后版本的class文件。3.常量池:主版本之后的是常量池入口,常量池是class文件結構中與其他項目關聯最多的數據類型,也是占用class文件空間最大的數據項目之一,同時還是在class文件中第一個出現的表類型的數據項目。因為常量池中常量數量不固定,所以在常量池入口前需要放置一個計數器,占用兩個字節。比如如果該位置的值為0x0016,那就代表常量池中有21項常量(從1開始),第0項空出來是為了滿足后面某些指向常量池的索引值的數據在特定情況下需要表達”不引用任何一個常量池項目“的意思,這種情況就可以把索引置為0來表示。class文件結構只有常量池的容量計數器是從1開始的,其他集合類型都是從0開始的。    常量池中主要存放兩類數據:字面量和符號引用;(1)字面量:比如文本字符串,被聲明為final的常量值等。(2)符號引用:包括類和接口的權限定名,字段的名稱和描述符,方法的名稱和描述符。注:class文件并不保存各個方法和字段的最終內存布局信息,因此這些字段和方法的符號引用不經過轉換的話是無法直接被虛擬機使用的,當虛擬機運行時,需要從常量池中獲得對應的符號引用,再在類創建時或者運行時解析并翻譯到具體的內存地址上(執行引擎在類加載的解析階段完成符號引用到直接引用的轉化)。常量池中的每一項常量都是一個表,每種表都有一個特點,那就是第一位是一個u1類型的標志位(tag,取值為1-12,缺少2),代表當前這個常量屬于哪種常量類型,所有常量類型所代表的的含義如下:而這每一種類型都有自己的結構,具體如下:4.訪問標志(access_flags):常量池之后,緊接著的兩個字節代表訪問標志,這個標志用于識別一些類或者接口層次的訪問信息(比如這個class是否是public是否是final等等),具體如下:5.類索引,父類索引,接口索引:類索引和父類索引都是一個u2類型的數據,而接口索引集合時一組u2類型的數據的集合,class文件中由這三項數據來確定這個類的繼承關系。類索引用于確定這個類的全限定名,父類索引用于確定這個類的父類的全限定名(除了kava.lang.Object以外所有類的父類索引均不為0)。接口索引集合用來描述這個類實現了哪些接口。    類索引和父類索引用兩個u2類型的索引值表示,它們各自指向一個類型為CONSTANT_Class_info的類描述符常量,通過CONSTANT_Class_info類型的常量中的索引值可以找到定義在CONSTANT_Utf8_info類型的常量中的全限定名字符串。6.字段表集合:字段表集合用于描述接口或者類中聲明的變量。字段包括了類級變量或者實例級變量,但是不包括方法內部聲明的變量。其結構如下:首先兩個字節是訪問符,這跟類中的access_flags非常類似,都是u2數據類型,其中可以設置的標志位的含義如下:其次是name_index,這是一個指向常量池的引用,代表字段的簡單名稱(指沒有類型和參數修飾的方法或者字段名稱);緊接著兩個字節是descriptor_index,字段方法描述符。描述符的作用是用來描述字段的數據類型、方法的參數列表(包括數量,類型以及順序)和返回值。根據規則,基本數據類型及代表無返回值的void類型都用一個大寫字符來表示,而對象類型則用字符L加對象的全限定名來表示。對于數組類型,每一維度會使用‘[’字符來表示,比如定義java.lang.String[][]類型的二維數組,將被記錄為[[Ljava/lang/String,而整型數組則標記為[I。用描述符來描述方法時,按照縣參數列表,后返回值的順序,參數列表按照參數的嚴格順序放在一組小括號”()“之內。比如void func(),描述符為()V,void foo(int[] a,cha b),描述為([IC)V.描述符之后是屬性表集合(attributes,當然之前是屬性表計數器),它用于存儲一些額外的信息。7.方法表集合:內容跟屬性表集合基本一致,下面是其結構:但是access_flags訪問標志與字段表是有區別的:另外,方法里的java代碼,經過javac編譯器編譯成字節碼指令后,將存放在方法的屬性表集合(attributes)中的一個名為code的屬性里面.8.屬性表集合:在class文件、字段表、方法表中都可以攜帶字節的屬性表集合,用于描述某些場景專有的信息。屬性表中的數據項目不需要有嚴格的順序,java虛擬機在運行時會自動的忽略掉不認識的屬性,其中系統預定義了9種虛擬機應該識別的屬性,如下:每一種屬性的名稱都是引用的常量池中的常量,屬性值的結構可以自定義,但是需要符合下面的結構:重點介紹下Code屬性。Code屬性:java程序方法體里面的代碼經過javac編譯器處理后,最終變為字節碼指令存儲在code屬性中,code屬性出現在方法表的屬性集合中,并非所有方法表都必須有code屬性,比如抽象方法,code屬性結構如下:首先attribute_name_index是一項指向常量池的引用(CONSTANT_Utf8_info),值為Code,它代表屬性名稱;attribute_length代表屬性值的長度;max_stack代表操作數棧的最大深度,在方法執行的任意時刻,操作數棧都不會超過這個深度,虛擬機運行的時候將根據這個值來分配棧幀中的操作數棧深度。緊接著max_locals代表局部變量表所需的存儲空間。這里需要注意的是,max_locals的單位是slot,slot即槽,是虛擬機為局部變量分配內存所使用的最小單位?;緮祿愋统薲ouble和long都占用1slot,double和long占用2slot,另外reference和returnAddress占1slot;code_length和code用來存儲java源程序編譯后生成的字節碼指令。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲日本成人女熟在线观看| 亚洲精品成a人在线观看| 91av在线网站| 亚洲精品日韩激情在线电影| 国产成人鲁鲁免费视频a| 日韩av一区二区在线| 福利视频第一区| 国产美女91呻吟求| 97在线日本国产| 成人黄色短视频在线观看| 亚洲欧洲一区二区三区在线观看| 91久久精品国产91久久| 国产精品91在线观看| 欧美乱大交xxxxx| 亚洲欧美在线看| 美女撒尿一区二区三区| 午夜美女久久久久爽久久| 亚洲999一在线观看www| 日韩中文字幕在线免费观看| 久久久久久国产精品三级玉女聊斋| 成人日韩av在线| 国产性猛交xxxx免费看久久| 亚洲丝袜一区在线| 日韩高清电影好看的电视剧电影| 欧美wwwwww| 97不卡在线视频| xxxx欧美18另类的高清| 国产成人jvid在线播放| 国产欧美精品在线| 97精品一区二区三区| 亚洲午夜精品久久久久久久久久久久| 日韩av电影手机在线观看| 亚洲电影中文字幕| 亚洲成人网在线| 91免费观看网站| 亚洲肉体裸体xxxx137| 成人在线激情视频| 日韩有码在线观看| 国产精品视频xxx| 欧美日韩激情美女| 精品人伦一区二区三区蜜桃免费| 亚洲美女在线视频| 欧美壮男野外gaytube| 亚洲人成电影网站色xx| 成人a免费视频| 日本国产精品视频| 亚洲丝袜av一区| 欧美亚洲成人精品| 欧美午夜视频在线观看| 国产精品视频在线观看| 国产在线播放不卡| 精品国产一区av| 亚洲女人天堂色在线7777| 欧洲美女免费图片一区| 久久久久亚洲精品国产| 日韩精品免费在线播放| 国产精品久久久久国产a级| 欧美亚洲国产视频小说| 国产精品久久二区| 成人做爽爽免费视频| 97精品伊人久久久大香线蕉| 久久综合久久八八| 国产自产女人91一区在线观看| 欧美午夜美女看片| 精品中文字幕在线2019| 国产精品91久久久| 亚洲专区国产精品| 国产精品三级美女白浆呻吟| 久久夜精品香蕉| 久久久久久亚洲精品中文字幕| 日本aⅴ大伊香蕉精品视频| 国产精品成人一区二区三区吃奶| 亚洲天堂精品在线| 国模吧一区二区| 精品视频中文字幕| 国产在线视频不卡| 精品久久久久久久久国产字幕| 亚洲最大成人网色| 欧美性精品220| 国产精品18久久久久久首页狼| 国产福利精品av综合导导航| 国产日韩综合一区二区性色av| 亚洲第一区第二区| 国产精品久久久久久久久久久新郎| 91精品久久久久久久久| 精品小视频在线| 国产精品wwwwww| 精品国产一区二区三区久久久狼| 亚洲成人精品在线| 97成人精品视频在线观看| 国产精品高精视频免费| 在线观看成人黄色| 欧美丰满少妇xxxxx| 亚洲最大中文字幕| 亚洲综合国产精品| 日本一区二区三区四区视频| 亚洲国产另类 国产精品国产免费| 美女性感视频久久久| 久99久在线视频| 色妞久久福利网| 岛国精品视频在线播放| 中文字幕久久亚洲| 懂色av中文一区二区三区天美| 欧美视频一二三| 欧美亚洲视频在线观看| 久久男人av资源网站| 亚洲性日韩精品一区二区| 国产午夜精品美女视频明星a级| 日韩美女在线看| 久久久久久网址| 亚洲欧美制服中文字幕| 欧美肥臀大乳一区二区免费视频| 亚洲国产精品va在线看黑人动漫| 欧美在线视频观看| 国产精品极品美女粉嫩高清在线| 欧美日韩视频在线| 国内精久久久久久久久久人| 久久精品国产亚洲一区二区| 91视频九色网站| 色噜噜狠狠狠综合曰曰曰88av| 亚洲性夜色噜噜噜7777| 日韩av电影院| 一区二区亚洲欧洲国产日韩| 亚洲午夜精品久久久久久久久久久久| 欧美xxxx做受欧美| 日韩成人在线观看| 欧美夜福利tv在线| 欧美黑人巨大精品一区二区| 深夜精品寂寞黄网站在线观看| 欧日韩不卡在线视频| 国产精品自拍偷拍| 91精品在线播放| 国产欧美日韩精品专区| 久久久在线观看| 亚洲精品国产精品自产a区红杏吧| 91精品视频网站| 日本精品视频在线观看| 琪琪第一精品导航| 欧美激情小视频| 日韩精品在线观看一区二区| 日韩最新中文字幕电影免费看| 国产精品免费久久久久影院| 国产精品户外野外| 日韩在线视频观看正片免费网站| 97视频在线观看网址| 中文字幕亚洲情99在线| 91九色国产社区在线观看| 亚洲精品国产美女| 欧美精品手机在线| 欧美电影在线观看完整版| 91精品久久久久久久久青青| 亚洲国产欧美在线成人app| 动漫精品一区二区| 国产精品美女免费| 欧美性受xxxx黑人猛交| 亚洲在线免费视频| 亚洲久久久久久久久久久| 国产精品久久久一区| 黑丝美女久久久| 国产精品网站视频| 中文字幕在线日韩| 国产日本欧美一区二区三区在线| 精品国产欧美一区二区三区成人| 久久在精品线影院精品国产|