Java Class文件分析(一)——魔術(shù)、版本號(hào)曲梗、常量池

Java在誕生時(shí)就以一次編寫赞警,到處運(yùn)行特點(diǎn)在各個(gè)平臺(tái)都可以進(jìn)行運(yùn)行。其實(shí)就是通過不同的編譯器(Javac編譯器,jrubyc編譯器,groovyc編譯器等等)將代碼編譯成規(guī)范的class文件虏两,虛擬機(jī)只要接收到claas文件而并不關(guān)心是class文件時(shí)哪一種編譯器編譯的愧旦,這樣就到達(dá)了(write one,run anywhere)定罢。所以要想更好的了解虛擬機(jī)笤虫,下面我們走進(jìn)class文件中!祖凫!

Class文件是一組以8bit為基礎(chǔ)單位的二進(jìn)制流琼蚯,各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格按順序緊湊地排列在class文件中,中間無任何添割符惠况。Class文件格式采用一種類似于C語(yǔ)言結(jié)構(gòu)體的偽結(jié)構(gòu)來儲(chǔ)存數(shù)據(jù)遭庶,這種偽結(jié)構(gòu)只有兩種數(shù)據(jù):無符號(hào)數(shù)和表。

無符號(hào)數(shù)屬于基本的數(shù)據(jù)類型稠屠,以u(píng)1,u2,u3,u4,u8表示1個(gè)字節(jié),2個(gè)字節(jié),3個(gè)字節(jié),4個(gè)字節(jié),8個(gè)字節(jié)峦睡,無符號(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文件格式

類型 名稱 數(shù)量
u4 magic(魔數(shù)) 1
u2 minor_version(JDK次版本號(hào)) 1
u2 major_version(JDK主版本號(hào)) 1
u2 constant_pool_count(常量池?cái)?shù)量) 1
cp_info constan_pool(常量表) constant_pool_count-1
u2 access_flags(訪問標(biāo)志) 1
u2 this_class(類引用) 1
u2 super_class(父類引用) 1
u2 interfaces_count(接口數(shù)量) 1
u2 interfaces(接口數(shù)組) interfaces_count
u2 fields_count(字段數(shù)量) 1
field_info fields(屬性表) fields_count
u2 methods_count(方法數(shù)量) 1
method_info methods(方法表) methods_count
u2 attributes_count(屬性數(shù)量) 1
attribute_info attributes(屬性表) attributes_count

由于方便龙屉,先講概念,最后翻譯一個(gè)class文件的形式進(jìn)行講解

一:魔數(shù):每個(gè)class文件的頭4個(gè)字節(jié)稱為魔數(shù)满俗,它的唯一作用就是確定這個(gè)文件是否為一個(gè)能被虛擬機(jī)接收的class文件转捕。值為CAFEBABE,緊接著就是4個(gè)字節(jié)的版本號(hào),其中前兩個(gè)為次版本號(hào)漫雷,后兩個(gè)為主版本號(hào)瓜富。到目前前8個(gè)字節(jié)就確定了。

二:版本號(hào):一個(gè)4個(gè)字節(jié)降盹,前兩字節(jié)表示次版本號(hào)与柑,后兩字節(jié)表示主版本號(hào)。

三:常量池:緊接著主次版本號(hào)就是常量池了蓄坏,第一個(gè)是常量池?cái)?shù)量(占兩個(gè)字節(jié))价捧,接下來就是常量池表,我以表的方式展現(xiàn)涡戳。

常量池表結(jié)構(gòu)

類型 名稱 數(shù)量
u1 tag(常量池的項(xiàng)目類型號(hào)) 1
u2 name_index(索引) 1

那么tag對(duì)應(yīng)的就是常量池的項(xiàng)目類型结蟋,下面我們來看看有哪些


image.png

讀取常量池的時(shí)候首先讀取標(biāo)志位,判斷常量類型渔彰,就可以知道對(duì)應(yīng)的結(jié)構(gòu)嵌屎,獲取對(duì)應(yīng)的信息了推正。
下面我們來一個(gè)簡(jiǎn)單的代碼,并編譯成class文件宝惰,以二進(jìn)制形式打開植榕,人為來解析一下。
Java代碼

public class Test{
    
}

class文件


image.png

使用javap指令反編譯

C:\Users\GH\Desktop>javap -verbose Test.class
Classfile /C:/Users/GH/Desktop/Test.class
  Last modified 2018-8-8; size 182 bytes
  MD5 checksum f22f52551c287057ed6d62d392d5647e
  Compiled from "Test.java"
public class Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#10         // java/lang/Object."<init>":()V
   #2 = Class              #11            // Test
   #3 = Class              #12            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               SourceFile
   #9 = Utf8               Test.java
  #10 = NameAndType        #4:#5          // "<init>":()V
  #11 = Utf8               Test
  #12 = Utf8               java/lang/Object
{
  public Test();
    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
}
SourceFile: "Test.java"

參考:
https://blog.csdn.net/weixin_40234548/article/details/81507125

https://blog.csdn.net/mz4138/article/details/81984325

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尼夺,一起剝皮案震驚了整個(gè)濱河市尊残,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淤堵,老刑警劉巖寝衫,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拐邪,居然都是意外死亡慰毅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門庙睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來事富,“玉大人,你說我怎么就攤上這事乘陪⊥程ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵啡邑,是天一觀的道長(zhǎng)贱勃。 經(jīng)常有香客問我,道長(zhǎng)谤逼,這世上最難降的妖魔是什么贵扰? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮流部,結(jié)果婚禮上戚绕,老公的妹妹穿的比我還像新娘。我一直安慰自己枝冀,他們只是感情好舞丛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著果漾,像睡著了一般球切。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绒障,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天吨凑,我揣著相機(jī)與錄音,去河邊找鬼户辱。 笑死鸵钝,一個(gè)胖子當(dāng)著我的面吹牛糙臼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒋伦,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼弓摘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼焚鹊!你這毒婦竟也來了痕届?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤末患,失蹤者是張志新(化名)和其女友劉穎研叫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧针,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚷炉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了探橱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申屹。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隧膏,靈堂內(nèi)的尸體忽然破棺而出哗讥,到底是詐尸還是另有隱情,我是刑警寧澤胞枕,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布杆煞,位于F島的核電站,受9級(jí)特大地震影響腐泻,放射性物質(zhì)發(fā)生泄漏决乎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一派桩、第九天 我趴在偏房一處隱蔽的房頂上張望构诚。 院中可真熱鬧,春花似錦铆惑、人聲如沸范嘱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彤侍。三九已至,卻和暖如春逆趋,著一層夾襖步出監(jiān)牢的瞬間盏阶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工闻书, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留名斟,地道東北人脑慧。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像砰盐,于是被迫代替她去往敵國(guó)和親闷袒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361