日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > 分析一個(gè)Java Class文件

分析一個(gè)Java Class文件

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-06-16 08:26:46 閱讀次數(shù):3478次


Java源碼文件TestClass.java:
package jvm.chapter6; //P166 public class TestClass { private int m; public int inc(){ return m+1; } }


展現(xiàn)這個(gè)Class文件的16進(jìn)制內(nèi)容:




從頭開(kāi)始分析=>
ca fe ba be :magic number;
00 00 00 34 : 版本號(hào)是1.8.0;
00 16: 說(shuō)明常量池有21個(gè)常量,1⑵1, index留做他用;接下來(lái)就是分別這21個(gè)常量的描寫(xiě):
07/00 02 :CONSTANT_Class_info 常量,類(lèi)名索引是該常量池的第2項(xiàng);
01/00 16/6a 76 6d 2f 63 68 61 70  74 65 72 36 2f 54 65 73 74 43 6c 61 73 73 :這是該常量池的第2項(xiàng),CONSTANT_Utf8_info常量,長(zhǎng)度是22(0x0016),正是字符串常量“jvm/chapter6/TestClass”;
07/00  04:CONSTANT_Class_info 常量,類(lèi)名索引是該常量池的第4項(xiàng);
01/00 10/6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74:這是該常量池的第4項(xiàng),CONSTANT_Utf8_info常量,長(zhǎng)度是16(0x0010),正是字符串常量“java/lang/Object”;
01/00 01/6d :CONSTANT_Utf8_info常量,是字符串常量"m";
01/00 01/49 :CONSTANT_Utf8_info常量,是字符串常量"m";
01/00 06/3c  69 6e 69 74 3e :CONSTANT_Utf8_info常量,是字符串常量"<init>";
01/00 03/28 29 56 :CONSTANT_Utf8_info常量,是字符串常量"()V";
01/00 04/43 6f  64 65 :CONSTANT_Utf8_info常量,是字符串常量"Code";
0a/00 03/00 0b: tag=10,表示CONSTANT_Methodref_info常量,聲明該方法的類(lèi)名稱(chēng)位于常量池的第3項(xiàng),即java/lang/Object,方法名和類(lèi)型NameAndType="<init>":()V;
0c/00 07/00 08: 接下來(lái)tag=12就是上面剛說(shuō)道的CONSTANT_NameAndType_info類(lèi)型,接下來(lái)的兩個(gè)索引分別指向方法名和描寫(xiě)符即"<init>"和“()V”,
01/00 0f/4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 :CONSTANT_Utf8_info常量,是字符串常量"LineNumberTable";
01/00 12/4c 6f 63 61 6c 56 61 72 69 61 62 6c 65 54 61  62 6c 65 :CONSTANT_Utf8_info常量,是字符串常量"LocalVariableTable";
01/00 04/74 68  69 73 :CONSTANT_Utf8_info常量,是字符串常量"this";
01/00 18/4c 6a 76 6d 2f 63 68 61 70 74 65 72 36 2f 54 65 73 74 43 6c 61 73 73 3b:CONSTANT_Utf8_info常量,是字符串常量"Ljvm/chapter6/TestClass;";
01/00 03 69 6e 63 :CONSTANT_Utf8_info常量,是字符串常量"inc";
01/00 03 28 29 49 :CONSTANT_Utf8_info常量,是字符串常量"()I";
09/00 01/00 13:代表Fieldref常量,然后接下來(lái)兩個(gè)u2分別表示聲明該字段的類(lèi)和NameAndType的索引;
0c/00 05/00 06:就是上面剛使用的NameAndType常量;
01/00 0a/53 6f 75 72 63 65 46 69 6c 65 :CONSTANT_Utf8_info常量,是字符串常量"SourceFile";
01 00 0e 54 65 73 74 43  6c 61 73 73 2e 6a 61 76 61::CONSTANT_Utf8_info常量,是字符串常量"TestClass.java";


上面就分析完了常量池中的字段,
00 21 : access_flags= ACC_PUBLIC | ACC_SUPER = 0x0021;
00 01 00 03 00  00:類(lèi)索引 父類(lèi)索引 和接口索引,常量池第3項(xiàng)表示的是Object,說(shuō)明了默許的父類(lèi)就是Object,沒(méi)有實(shí)現(xiàn)接口,所以interfaces_count=0;
00 01/00 02/00 05/00 06/00 00: 接下來(lái)的是字段表集合(fields_info),fields_count=1,access_flags=0x0002=ACC_PRIVATE, 代表字段名稱(chēng)的name_index=5(常量池的第5項(xiàng)是CONSTANT_Utf8_info類(lèi)型的字符串m),字段描寫(xiě)符descriptor_index=0x0006(常量池的第5項(xiàng)是CONSTANT_Utf8_info類(lèi)型的字符串I),最后atributes_count=0,說(shuō)明不包括額外的信息。總上這些信息正是為了說(shuō)明定義的字段“private int m”;


00 02/00 01/00  07/00 08/00 01/00 09/00 00 00 2f/00 01/00 01/00  00 00 05/2a b7 00 0a b1:接下來(lái)的是方法集合(methods_info),有兩個(gè)方法,第1個(gè)方法的訪(fǎng)問(wèn)標(biāo)志是0x0001=ACC_PUBLIC,名稱(chēng)索引是0x0007,指向常量池中的<init>,描寫(xiě)符索引值是0x0008,指向常量池中的"()V",接下來(lái)屬性表計(jì)數(shù)器attributes_count=1,屬性名稱(chēng)索引是0x0009對(duì)應(yīng)的是“Code”,接下來(lái)就是Code屬性表的結(jié)構(gòu):屬性值的長(zhǎng)度attribute_length=0x2f;操作數(shù)棧的最大深度和本地變量表的容量都是0x0001;字節(jié)碼指令長(zhǎng)度是5,翻譯“2a b7 00 0a b1”的進(jìn)程是:
1)讀入2a,對(duì)應(yīng)的是aload_0 ,將第1個(gè)援用類(lèi)型的本地變量推送到操作數(shù)棧頂;
2)讀入b7,對(duì)應(yīng)的是invokespecial,作用是調(diào)用以棧頂?shù)膔eference類(lèi)型所指向的對(duì)象的構(gòu)造器方法 實(shí)例初始化方法 私有方法,接下來(lái)有1個(gè)u2類(lèi)型的參數(shù)說(shuō)明具體調(diào)用哪一個(gè)方法,它指向常量池中1個(gè)CONSTANT_Methodref_info的常量,即那個(gè)方法的符號(hào)援用;
3)00 0a正是上面invokespecial的參數(shù),指向常量池中的1個(gè)Methodref常量,對(duì)應(yīng)的應(yīng)當(dāng)是Object.init()方法;
4)b1,對(duì)應(yīng)的指令是return,并且返回類(lèi)型是oid,當(dāng)前方法對(duì)應(yīng)的指令結(jié)束。


繼續(xù)上面的分析,
00 00/00 02/00 0c/00 00 00 06/00 01/00 00/00 03|00 0d/00 00 00 0c/00 01|00 00/00 05/00 0e/00 0f/00 00:exception_table_length=0,該方法沒(méi)有拋出異常,然后attributes_count=2,該Code屬性有倆屬性:0x000c指向常量池中的“LineNumberTable”,attribute_length=6,line_number_table_length=1,就是記錄了1對(duì)java源碼行號(hào)和字節(jié)碼行號(hào)的對(duì)應(yīng)關(guān)系(3:0);0x000d指向常量池中的“LocalVariableTable”,attribute_length=12,local_variable_table_length=1(代表了1個(gè)棧幀和程序中的局部變量關(guān)聯(lián)關(guān)系),start_pc=0x0000,length=0x0005表征該局部變量在字節(jié)碼中的作用范圍(就是這個(gè)方法內(nèi)),name_index=0x000e, descriptor_index=0x000f表示該局部變量的名稱(chēng)及其描寫(xiě)符,即為“this”, "Ljvm/chapter6/TestClass";通過(guò)javap的輸出都可以1目了然。index=0x0000代表該局部變量在棧幀局部變量表中Slot的位置。


接下來(lái)看第2個(gè)方法,
00 01/00 10/00 11/00 01/00 09/00 00 00 31/00 02/00 01/00 00 00 07/2a b4 00 12 04 60 ac/:方法的訪(fǎng)問(wèn)標(biāo)志是0x0001=ACC_PUBLIC,名稱(chēng)索引是16,指向常量池中的“inc”,描寫(xiě)符索引值是0x0011,指向常量池中的"()I",接下來(lái)屬性表計(jì)數(shù)器attributes_count=1,屬性名稱(chēng)索引是0x0009對(duì)應(yīng)的是“Code”,接下來(lái)就是Code屬性表的結(jié)構(gòu):屬性值的長(zhǎng)度attribute_length=0x31;操作數(shù)棧的最大深度是2,本地變量表的容量是1;字節(jié)碼指令長(zhǎng)度是7,翻譯“2a b4 00 12 04 60 ac”的進(jìn)程是:
1)讀入2a,對(duì)應(yīng)的是aload_0 ,將第1個(gè)援用類(lèi)型的本地變量推送到操作數(shù)棧頂;
2)讀入b4,對(duì)應(yīng)的指令是getfield,取得實(shí)例域,并壓入棧頂,他需要參數(shù)用來(lái)講明把哪一個(gè)變量入棧,即下面;
3)讀入00 12,用來(lái)指明getfield 哪一個(gè)字段,指向常量池中的1個(gè)Fieldref常量,“jvm/chapter6/TestClass.m:I”;
4)讀入04,對(duì)應(yīng)的指令是iconst_1,將int類(lèi)型的1推至棧頂;
5)讀入60,對(duì)應(yīng)的指令是iadd,將棧頂兩個(gè)int類(lèi)型的數(shù)值相加并把結(jié)果壓入棧頂;
6)讀入ac,對(duì)應(yīng)的指令是ireturn,從當(dāng)前方法返回int,結(jié)束。
后面的倆屬性就和分析第1個(gè)方法類(lèi)似。


至此,就分析完了1個(gè)簡(jiǎn)單的Class文件的結(jié)構(gòu),清晰了很多。


附:

Javap TestClass.class的結(jié)果:$ javap -verbose TestClass.class 

Classfile /home/vonzhou/GitHub/JavaProject/learning-java/bin/jvm/chapter6/TestClass.class
  Last modified Apr 29, 2015; size 379 bytes
  MD5 checksum 70a67e773b621619d03f9d1b5ac91af6
  Compiled from "TestClass.java"
public class jvm.chapter6.TestClass
  SourceFile: "TestClass.java"
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Class              #2;            //  jvm/chapter6/TestClass
   #2 = Utf8               jvm/chapter6/TestClass;
   #3 = Class              #4;            //  java/lang/Object
   #4 = Utf8               java/lang/Object;
   #5 = Utf8               m;
   #6 = Utf8               I;
   #7 = Utf8               <init>;
   #8 = Utf8               ()V;
   #9 = Utf8               Code;
  #10 = Methodref          #3.#11;        //  java/lang/Object."<init>":()V
  #11 = NameAndType        #7:#8;         //  "<init>":()V
  #12 = Utf8               LineNumberTable;
  #13 = Utf8               LocalVariableTable;
  #14 = Utf8               this;
  #15 = Utf8               Ljvm/chapter6/TestClass;;
  #16 = Utf8               inc;
  #17 = Utf8               ()I;
  #18 = Fieldref           #1.#19;        //  jvm/chapter6/TestClass.m:I
  #19 = NameAndType        #5:#6;         //  m:I
  #20 = Utf8               SourceFile;
  #21 = Utf8               TestClass.java;
{
  public jvm.chapter6.TestClass();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #10;                // Method java/lang/Object."<init>":()V
         4: return        
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
        0       5       0    this   Ljvm/chapter6/TestClass;


  public int inc();
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0       
         1: getfield      #18;                // Field m:I
         4: iconst_1      
         5: iadd          
         6: ireturn       
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
         0       7      0     this   Ljvm/chapter6/TestClass;
}



生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線(xiàn)----------------------------
分享到:
------分隔線(xiàn)----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 波多野结衣在线播放一区 | 精品三区视频 | 99综合 | 欧美精品成人 | 中文字幕av第一页 | 麻豆综合 | 91九色在线播放 | 人成精品 | 天堂网亚洲| 国产精品久久久久久a | 欧美日韩免费在线观看 | 99视频在线免费观看 | 色欧美在线 | 精品日产卡一卡二卡麻豆 | 中文字幕成人网 | 欧美日在线 | 亚洲一区二区三区四区免费观看 | 精品国产一区二区三区四区四 | 久久网国产 | 亚洲永久 | 美女一区 | 最近中文字幕在线mv视频7 | 福利视频一区二区三区 | 亚洲国产精品网站 | 日韩在线视频一区 | 欧美区一区二 | 狠狠干夜夜 | 久久久久成人精品 | 国产黄色毛片 | 色69av| 国产精品久久毛片av大全日韩 | 欧美精品午夜 | 天天拍天天操 | 麻豆一区二区 | 在线无码| 国产精品国产成人国产三级 | 青青草自拍偷拍 | 欧美日本色 | 91精品国产自产91精品 | 日本在线观看一区二区 | 搞黄视频在线看 |