Java Class 字節(jié)碼詳解

一、平臺無關(guān)性

Java是與平臺無關(guān)的語言赶促,這得益于Java源代碼編譯后生成的存儲字節(jié)碼的文件好芭,即Class文件,以及Java虛擬機(jī)的實(shí)現(xiàn)邻耕。虛擬機(jī)并不關(guān)心Class的來源是什么語言鸥咖,只要它符合一定的結(jié)構(gòu),就可以在Java中運(yùn)行兄世,這樣就出現(xiàn)了JRuby等語言也能夠在JVM中運(yùn)行啼辣。


20140318212143937.png
二、類文件結(jié)構(gòu)

Class文件是一組以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流御滩,根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定鸥拧,Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲,這種偽結(jié)構(gòu)中只有兩種數(shù)據(jù)類型:無符號數(shù)和表削解。無符號數(shù)屬于基本數(shù)據(jù)類型富弦,以u1、u2氛驮、u4腕柜、u8來分別代表1、2矫废、4盏缤、8個字節(jié)的無符號數(shù)。表是由多個無符號數(shù)或其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的符合數(shù)據(jù)類型蓖扑,所有的表都習(xí)慣性地以“_info”結(jié)尾唉铜。

三、剖析class文件

首先律杠,來編寫一個簡單的HelloWorld.java程序

public class HelloWorld {
     public static void main(String[] args) {
         System.out.println("Hello World");
    }
}

看看.class文件的內(nèi)容吧

cafe babe 0000 0034 001d 0a00 0600 0f09
0010 0011 0800 120a 0013 0014 0700 1507
0016 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 046d 6169
6e01 0016 285b 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 2956 0100 0a53 6f75
7263 6546 696c 6501 000f 4865 6c6c 6f57
6f72 6c64 2e6a 6176 610c 0007 0008 0700
170c 0018 0019 0100 0b48 656c 6c6f 2057
6f72 6c64 0700 1a0c 001b 001c 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 1d00
0100 0100 0000 052a b700 01b1 0000 0001
000a 0000 0006 0001 0000 0001 0009 000b
000c 0001 0009 0000 0025 0002 0001 0000
0009 b200 0212 03b6 0004 b100 0000 0100
0a00 0000 0a00 0200 0000 0300 0800 0400
0100 0d00 0000 0200 0e

JVM定義的class文件結(jié)構(gòu)如下:ClassFile結(jié)構(gòu)

類型 名稱 數(shù)量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count-1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attributes_count 1
attribute_info attributes attributes_count

JDK提供的解析工具

javap -verbose HelloWorld.class

Classfile /Users/yudesong/Project/java/HelloWorld.class
  Last modified 2018-1-23; size 425 bytes
  MD5 checksum 63e47f1d243e0eb6bc952df3f6ac0d5a
  Compiled from "HelloWorld.java"
public class HelloWorld
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #18            // Hello World
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // HelloWorld
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               HelloWorld.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Class              #23            // java/lang/System
  #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #18 = Utf8               Hello World
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               HelloWorld
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public HelloWorld();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         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
      LineNumberTable:
        line 3: 0
        line 4: 8
}
SourceFile: "HelloWorld.java"

建議直接安裝IDEA 插件jclasslib

參考文章

1. 【深入Java虛擬機(jī)】之二:Class類文件結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末打毛,一起剝皮案震驚了整個濱河市柿赊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幻枉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡蜓,死亡現(xiàn)場離奇詭異熬甫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蔓罚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門椿肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豺谈,你說我怎么就攤上這事郑象。” “怎么了茬末?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵厂榛,是天一觀的道長。 經(jīng)常有香客問我丽惭,道長击奶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任责掏,我火速辦了婚禮柜砾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘换衬。我一直安慰自己痰驱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布瞳浦。 她就那樣靜靜地躺著担映,像睡著了一般。 火紅的嫁衣襯著肌膚如雪术幔。 梳的紋絲不亂的頭發(fā)上另萤,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音诅挑,去河邊找鬼四敞。 笑死,一個胖子當(dāng)著我的面吹牛拔妥,可吹牛的內(nèi)容都是我干的忿危。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼没龙,長吁一口氣:“原來是場噩夢啊……” “哼铺厨!你這毒婦竟也來了缎玫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤解滓,失蹤者是張志新(化名)和其女友劉穎赃磨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洼裤,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邻辉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腮鞍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值骇。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖移国,靈堂內(nèi)的尸體忽然破棺而出吱瘩,到底是詐尸還是另有隱情,我是刑警寧澤迹缀,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布使碾,位于F島的核電站,受9級特大地震影響裹芝,放射性物質(zhì)發(fā)生泄漏部逮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一嫂易、第九天 我趴在偏房一處隱蔽的房頂上張望兄朋。 院中可真熱鬧,春花似錦怜械、人聲如沸颅和。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峡扩。三九已至,卻和暖如春障本,著一層夾襖步出監(jiān)牢的瞬間教届,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工驾霜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留案训,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓粪糙,卻偏偏與公主長得像强霎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓉冈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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