《Java核心技術(shù)》 Class類文件結(jié)構(gòu)

運(yùn)行機(jī)制

開篇

源代碼HelloWorld.java

/**
 * Created by jack on 2017/3/16.
 *
 * @author jack
 * @date 2017/03/16
 */
public class HelloWorld {
    public static void main(String[] args){
        System.out.println("Hello,World");
    }
}

編譯成HelloWorld.class

cafe babe 0000 0031 0022 0a00 0600 1409
0015 0016 0800 170a 0018 0019 0700 1a07
001b 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 124c 6f63
616c 5661 7269 6162 6c65 5461 626c 6501
0004 7468 6973 0100 0c4c 4865 6c6c 6f57
6f72 6c64 3b01 0004 6d61 696e 0100 1628
5b4c 6a61 7661 2f6c 616e 672f 5374 7269
6e67 3b29 5601 0004 6172 6773 0100 135b
4c6a 6176 612f 6c61 6e67 2f53 7472 696e
673b 0100 0a53 6f75 7263 6546 696c 6501
000f 4865 6c6c 6f57 6f72 6c64 2e6a 6176
610c 0007 0008 0700 1c0c 001d 001e 0100
0b48 656c 6c6f 2c57 6f72 6c64 0700 1f0c
0020 0021 0100 0a48 656c 6c6f 576f 726c
6401 0010 6a61 7661 2f6c 616e 672f 4f62
6a65 6374 0100 106a 6176 612f 6c61 6e67
2f53 7973 7465 6d01 0003 6f75 7401 0015
4c6a 6176 612f 696f 2f50 7269 6e74 5374
7265 616d 3b01 0013 6a61 7661 2f69 6f2f
5072 696e 7453 7472 6561 6d01 0007 7072
696e 746c 6e01 0015 284c 6a61 7661 2f6c
616e 672f 5374 7269 6e67 3b29 5600 2100
0500 0600 0000 0000 0200 0100 0700 0800
0100 0900 0000 2f00 0100 0100 0000 052a
b700 01b1 0000 0002 000a 0000 0006 0001
0000 0007 000b 0000 000c 0001 0000 0005
000c 000d 0000 0009 000e 000f 0001 0009
0000 0037 0002 0001 0000 0009 b200 0212
03b6 0004 b100 0000 0200 0a00 0000 0a00
0200 0000 0900 0800 0a00 0b00 0000 0c00
0100 0000 0900 1000 1100 0000 0100 1200
0000 0200 13

這就是jvm的byte code字節(jié)碼狭园。這一串“天書”,如果不看JVM虛擬機(jī)規(guī)范的人糊治,正常的智商,是看不懂的罚舱。

想看懂這一串十六進(jìn)制的字符井辜,就要了解class文件協(xié)議。

第一行釋義:

magic:魔數(shù)管闷,0xCAFEBABE(cafe babe)
minor_version:占2字節(jié)粥脚,次版本號,0x0000
majro_version:占2字節(jié)包个,主版本號刷允,0x0031,轉(zhuǎn)化為十進(jìn)制為49碧囊,是使用JDK1.5編譯的(JDK1.5:0x0031,JDK1.6:0x0032,JDK1.7:0x0033)
高版本的JDK可以向下兼容以前版本的Class文件树灶,但是無法運(yùn)行以后版本的Class文件,即使文件格式并未發(fā)生變化
如果使用JDK1.5運(yùn)行使用JDK1.6編譯的Class文件糯而,會報:

java.lang.UnsupportedClassVersionError: Bad version number in .class file  

就是由于JDK1.6編譯的文件版本號超過了JDK1.5虛擬機(jī)所接受的范圍

Java class文件是二進(jìn)制文件天通。為了便于理解它,JVM提供者提供了javap熄驼,反匯編器(編譯,反編譯的本質(zhì),是“映射”)妒潭。

一切皆是映射(光劍)

使用javap產(chǎn)生的結(jié)果是Java匯編語言着帽。在上面的例子中,下面的Java匯編代碼是通過:

javap -c HelloWorld.class

進(jìn)行反匯編得到的祭芦。

$ javap -c HelloWorld.class 
Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello,World
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}


所以說筷笨,如果你足夠牛逼,不需要使用java語言寫源碼,直接使用jvm指令集寫jvm的匯編語言奥秆。這樣逊彭,什么Scala,Java,Kotlin,Clojure這些運(yùn)行在jvm上的高級編程語言,對你來說构订,真的就是浮云了侮叮。你也不需要糾結(jié)什么OOP,F(xiàn)P悼瘾,Design Pattern, etc.

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

class文件的結(jié)構(gòu)

簡單講囊榜,jvm的class文件是針對jvm的私家定制。只要運(yùn)行在jvm上byte code亥宿,都需要按照class文件format來卸勺。否則jvm解析不了。自然無法執(zhí)行烫扼。

官網(wǎng)文檔: The Java Virtual Machine class file format

class文件時java虛擬機(jī)執(zhí)行引擎的數(shù)據(jù)入口曙求,也是java技術(shù)體系的基礎(chǔ)支柱之一,了解class文件的結(jié)構(gòu)對后面進(jìn)一步了解虛擬機(jī)執(zhí)行引擎有很重要的意義映企。

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

ClassFile數(shù)據(jù)結(jié)構(gòu)

ClassFile {  
    u4 magic;//魔數(shù)(0xCAFEBABE)  
    u2 minor_version;//次版本號  
    u2 major_version;//主版本號  
    u2 constant_pool_count;//常量池容量計數(shù)值  
    cp_info constant_pool[constant_pool_count-1];//常量池  
    u2 access_flags;//訪問標(biāo)志  
    u2 this_class;//類索引  
    u2 super_class;//父類索引  
    u2 interfaces_count;//接口計數(shù)器  
    u2 interfaces[interfaces_count];//接口索引集合  
    u2 fields_count;//字段計數(shù)器  
    field_info fields[fields_count];//字段表  
    u2 methods_count;//方法計數(shù)器  
    method_info methods[methods_count];//方法表  
    u2 attributes_count;//屬性表計數(shù)器  
    attribute_info attributes[attributes_count];//屬性表集合  
}  

Class文件中,類的全限定名囤攀、字段软免、方法都是使用CONSTANT_Utf8_info類型常量來描述名稱,而該常量的長度由2個字節(jié)表示抚岗,所以類的全限定名或杠、字段名、方法名的最大長度不能超過2個字節(jié)所能表示的最大整數(shù)宣蔚,也就是65535.

博文參考:

http://blog.csdn.net/a19881029/article/details/16117251

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末向抢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胚委,更是在濱河造成了極大的恐慌挟鸠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亩冬,死亡現(xiàn)場離奇詭異艘希,居然都是意外死亡硼身,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門覆享,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佳遂,“玉大人,你說我怎么就攤上這事撒顿〕笞铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵凤壁,是天一觀的道長吩屹。 經(jīng)常有香客問我,道長拧抖,這世上最難降的妖魔是什么煤搜? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮唧席,結(jié)果婚禮上擦盾,老公的妹妹穿的比我還像新娘。我一直安慰自己淌哟,他們只是感情好厌衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绞绒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榕暇。 梳的紋絲不亂的頭發(fā)上蓬衡,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音彤枢,去河邊找鬼狰晚。 笑死,一個胖子當(dāng)著我的面吹牛缴啡,可吹牛的內(nèi)容都是我干的壁晒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼业栅,長吁一口氣:“原來是場噩夢啊……” “哼秒咐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碘裕,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤携取,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帮孔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雷滋,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晤斩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焕檬。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澳泵,靈堂內(nèi)的尸體忽然破棺而出实愚,到底是詐尸還是另有隱情,我是刑警寧澤烹俗,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布爆侣,位于F島的核電站,受9級特大地震影響幢妄,放射性物質(zhì)發(fā)生泄漏兔仰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一蕉鸳、第九天 我趴在偏房一處隱蔽的房頂上張望乎赴。 院中可真熱鬧,春花似錦潮尝、人聲如沸榕吼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹蚣。三九已至,卻和暖如春乱凿,著一層夾襖步出監(jiān)牢的瞬間顽素,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工徒蟆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胁出,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓段审,卻偏偏與公主長得像全蝶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寺枉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容