Java學(xué)習(xí)之路

          墻上蘆葦,頭重腳輕根底淺;山間竹筍,嘴尖皮厚腹中空。

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          2009年3月21日 #

          讀書筆記:java的class文件格式分析(一)

          閱讀Java Virtual Machine Specification中的第四章,理解Java的class文件格式。

          class文件由8位的字節(jié)流組成。

          The ClassFile Structure

          ClassFile{

          u4 magic;

          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 interfaces_count;

          u2 interfaces[interfaces_count];

          u2 fields_count;

          field_info fields[fields_count];

          u2 methods_count;

          method_info methods[methods_count];

          u2 attributes_count;

          attribute_info attributes[attrributes_count];

          }

          說明:u2表示無符號(hào)2字節(jié)量,u4表示無符號(hào)4字節(jié)量。

          各字段的說明:

          magic

          一般二進(jìn)制文件中都有magic number這一項(xiàng),這個(gè)數(shù)說明該文件是一個(gè)class文件,它的值是0xcAFEBABE。

          minor_version,major_version

          class文件的版本號(hào)。

          constant_pool_count

          常量池表中項(xiàng)目數(shù)加1得到。從后面的cp_info constant_pool[constant_pool_count-1];也容易理解這個(gè)值的意思。

          cp_info constant_pool[]

          存儲(chǔ)該class文件中使用到的常量信息。

          access_flag

          說明該class文件的訪問權(quán)限和相關(guān)屬性,通過位掩碼來設(shè)定。

          Flag Name 解釋
          ACC_PUBLIC 0x0001 public
          ACC_FINAL 0x0010 final
          ACC_SUPER 0x0020 跟調(diào)用invokespecial指令時(shí)的處理有關(guān)
          ACC_INTERFACE 0x0200 這是個(gè)接口
          ACC_ABSTRACT 0x0400 abastract
          ACC_SYNTHETIC 0x1000 沒有在源代碼中出現(xiàn),該類是編譯器生成的
          ACC_ANNOTATION 0x2000 注解類型
          ACC_ENUM 0x4000 枚舉類型

           

          這些屬性都很容易理解,比如我們定義一個(gè)類public final Test{},則Test.class的access_flag中,ACC_PUBLIC和ACC_FINAL是置位的,而ACC_INTERFACE一項(xiàng)肯定是0。很多類似的組合規(guī)則倒是容易自己總結(jié)出來,比如如果ACC_INTERFACE置位了,那肯定ACC_ABSTRACT也是置位的,因?yàn)榻涌诳隙ㄊ浅橄蟮模蝗绻鸄CC_ANNOTATION置位了,那ACC_ANNOTATION肯定同時(shí)置位,等等,諸如此類。

          畫一個(gè)具體的位示意圖表示:

          image

          this_class

          一個(gè)下標(biāo),指向常量池表中代表當(dāng)前類的Constant_Class_info。

          super_class

          為0,或者為一個(gè)下標(biāo),指向常量池中代表其父類的Constant_Class_info。如果這個(gè)值為0,那么當(dāng)前類肯定是Object類。如果當(dāng)前類是一個(gè)接口,該下標(biāo)指向的是Object類的描述信息。

          interface_count

          該類實(shí)現(xiàn)的接口數(shù),或者該接口實(shí)現(xiàn)的超接口數(shù)。

          interfaces[]

          具體的接口信息,每一項(xiàng)都是常量池表中的一個(gè)下標(biāo),指向表示接口的Constant_Class_info。

          后面幾個(gè)依次是字段(field),方法(methods)和屬性的描述,不再贅述,

           

          下面具體的分析一個(gè)class文件。源文件很簡(jiǎn)單:

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

           

          編譯,得到Test.class文件,使用WinHex打開。

          image

          前4個(gè)字節(jié)是magic部分,內(nèi)容為0xCAFEBABE;隨后的4個(gè)字節(jié)是class文件的版本號(hào),這里主版本號(hào)是0x0032,也就是50,這是使用jdk1.6編譯出的class文件。再后面的2個(gè)字節(jié)是常量池表的大小信息,0x001D,也就是29,說明常量池表中一共有28項(xiàng)。為了方便觀察,可以使用javap -verbose Test得到的結(jié)果和當(dāng)前的二進(jìn)制文件進(jìn)行對(duì)比。

          入門到此,以后繼續(xù)。

          posted @ 2009-03-23 12:20 Zang XT 閱讀(133) | 評(píng)論 (0)編輯 收藏

          學(xué)習(xí)目標(biāo)

                 以一種玩的心態(tài)學(xué)習(xí)java,關(guān)注java的編譯實(shí)現(xiàn)和java虛擬機(jī)原理,暫時(shí)不去關(guān)注java相關(guān)的各種應(yīng)用。目標(biāo)不能太多,更不能太高,切忌!
          幾個(gè)具體的,可操作的目標(biāo):
                 class文件格式分析。根據(jù)jvm規(guī)范中的定義,理解class文件結(jié)構(gòu),能自己寫一個(gè)分析工具;分析javap的源代碼。  深入學(xué)習(xí)編譯原理,分析javac的源代碼。以前分析過一小部分,但不夠深入。
                 研究多線程編程模型,有幾本書重點(diǎn)的看一下,《unix網(wǎng)絡(luò)編程》,《面向模式的軟件體系結(jié)構(gòu)卷2:用于并發(fā)和網(wǎng)絡(luò)化對(duì)象的模式》,《PATTERN-ORIENTED SOFTWARE ARCHITECTURE A Pattern Language for Distributed Computing》,《Java Concurrency in Practice》。
                 openjdk已經(jīng)在Ubuntu上構(gòu)建成功,可以考慮進(jìn)行一些跟蹤和調(diào)試分析。

          posted @ 2009-03-21 18:28 Zang XT 閱讀(119) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 子洲县| 滕州市| 广州市| 托里县| 景德镇市| 凤城市| 天全县| 湄潭县| 侯马市| 开原市| 电白县| 兰考县| 思茅市| 苍梧县| 资阳市| 大竹县| 连州市| 麻江县| 东乡| 霍城县| 邵阳市| 台前县| 拜泉县| 额敏县| 浮梁县| 西畴县| 青冈县| 宾川县| 淮南市| 渝北区| 同江市| 达日县| 浦城县| 自治县| 桃园县| 景德镇市| 广水市| 天等县| 长武县| 临夏市| 桃园市|