我的一畝三分地

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            2 隨筆 :: 14 文章 :: 3 評(píng)論 :: 0 Trackbacks
          看了第6章的java class文件這一部分,我覺(jué)得對(duì)class文件有進(jìn)一步的了解。于是想作一點(diǎn)筆記,以備以后查時(shí)方便。
          ????? 這章的一個(gè)例子雖然簡(jiǎn)單,但是我覺(jué)的很有一定代表性。例子如下:

          1:class Act {
          2:?? public static void doMathForever(int m) {
          3:????? int i = 0;
          4:???? int n=4>3?1:0;
          5:??????? for (;;) {
          6:?????????? i += 1;
          7:??????????? i *= 2;
          8:?????? }
          9:??? }
          10:}


          我用javap -verbose Act查看,代碼如下:(紅色為自己加上的注解)
          Compiled from "Act.java"?????
          因?yàn)榫幾g原文件不一定必須與java語(yǔ)言相關(guān),可以使用其他語(yǔ)言來(lái)編寫(xiě)程序,然后將其編譯為class文件,所以這里要寫(xiě)上Act.java而不是Act. 呵呵,想來(lái)以前為什么javac 來(lái)編譯源文件時(shí)一定要加.java,而java 執(zhí)行時(shí)就不需要加.java了,當(dāng)時(shí)就是搞不懂,現(xiàn)在明白了。
          class Act extends java.lang.Object
          ? SourceFile: "Act.java"
          SourceFile屬性,它提供了產(chǎn)生class文件的源文件的名稱(chēng),它是一個(gè)可選的項(xiàng),為什么說(shuō)它是可選項(xiàng)的,因?yàn)閏lass可以自己用UE等工具寫(xiě)。
          ? minor version: 0
          ? major version: 49
          版本號(hào):我用的是5.0的,出來(lái)的major version 是49,書(shū)上說(shuō)1.0或1.2是45,1.4我想可能是48?吧。呵呵,還沒(méi)有試過(guò)。
          ? Constant pool:
          這個(gè)是常量池,剛看書(shū)的時(shí)候我還以為常量池放的一定是常量。錯(cuò)。
          常量池就是該類(lèi)型所用常量的一個(gè)有序集合,包括直接常量(String,integer,floating??point常量)和對(duì)其他類(lèi)型、字段和方法的符號(hào)引用。
          const #1 = Method?#3.#12;?//? java/lang/Object."<init>":()V
          因?yàn)镃onstant pool#0是不用的,所以只能從#1開(kāi)始,但不知為什么第一個(gè)是Method而不是class,我現(xiàn)在還不明白。
          const #2 = class?#13;?//? Act
          CONSTANT_Class是對(duì)一個(gè)類(lèi)或接口的符號(hào)引用。這個(gè)是指向#13
          const #3 = class?#14;?//? java/lang/Object
          const #4 = Asciz?<init>;
          ?這個(gè)Asciz應(yīng)該表示是CONSTANT_Utf8吧,因?yàn)镃?ONSTANT_Utf8可以是存儲(chǔ)四種基本信息類(lèi)型:文字字符串、被定義的類(lèi)和接口描述、對(duì)其他類(lèi)或接口的符號(hào)引用以及屬性相關(guān)的字符串。
          <init>是實(shí)例的初始化方法,是實(shí)例調(diào)用方法前必須要<init>的,
          <clinit>是類(lèi)的初始化方法。
          const #5 = Asciz?()V;
          此<init>的描述符,()V表示<init>沒(méi)有帶參數(shù),返回的是void型的。
          書(shū)上介紹:
          ()I? int getSize()??
          () Ljava/lang/String????? String toString()

          const #6 = Asciz?Code;
          Code在所有不是抽象或者本地方法的method_info信息中,都存在一個(gè)Code_attribute表。
          但是我試一下在抽象的方法中同樣也有code的啊,不懂中。
          const #7 = Asciz?LineNumberTable;
          LineNumberTable屬性建立了方法字節(jié)碼流偏移量和源代碼行號(hào)之間的映射關(guān)系。關(guān)于這一點(diǎn),我在下面詳細(xì)談到。
          const #8 = Asciz?doMathForever;
          #8 字段名和方法名以簡(jiǎn)單名稱(chēng)出現(xiàn)在常量池的入口中,存的時(shí)候存簡(jiǎn)單名字,調(diào)用的時(shí)候要加?上全限定名
          const #9 = Asciz?(I)V;
          doMathForover的描述符,參數(shù)是int類(lèi)型,返回值是void類(lèi)型
          const #10 = Asciz?SourceFile;
          const #11 = Asciz?Act.java;
          const #12 = NameAndType?#4:#5;//? "<init>":()V
          NameAndType指向字段或者方法的符號(hào)引用的一部分。為什么沒(méi)有指向#8,#9呢?不懂中。
          const #13 = Asciz?Act;
          const #14 = Asciz?java/lang/Object;

          #13,#14 CONSTANT_Utf8_info?表的入口,容納了?類(lèi)/接口全限定名等信息。用“/”代替“.”。在class文件的this_class字段是對(duì)常量池的一個(gè)引用,指向了常量池中CONSTANT_ClASS_info表,該表由兩項(xiàng)組成,即標(biāo)簽和name_index。在這個(gè)例子里,this_class的值為2,也就是常量池里的第二項(xiàng),這項(xiàng)標(biāo)簽是class,name_index是13,即指向常量池的第13項(xiàng)。第13項(xiàng)里就有當(dāng)前類(lèi)的全限定名。
          {
          Act();
          ? Code:
          ?? Stack=1, Locals=1, Args_size=1
          需要的棧為1個(gè),只是this的存取;本地變量為1個(gè),也是this,方法的參數(shù)是1個(gè),也是this傳入。
          ?? 0:?aload_0
          從局部變量0中裝載引用類(lèi)型。
          ?? 1:?invokespecial?#1; //Method java/lang/Object."<init>":()V
          調(diào)用Object的<init>方法,因?yàn)槊總€(gè)類(lèi)都是繼承Object,所以實(shí)例時(shí)都要調(diào)用Object的<init>方法。
          ?? 4:?return
          ? LineNumberTable:
          ?? line 1: 0

          public static void doMathForever(int);
          ? Code:
          ?? Stack=2, Locals=3, Args_size=1
          ?? 0:?iconst_0?
          將i 壓入棧
          ?? 1:?istore_1?
          放i
          ?? 2:?iconst_1
          同上
          ?? 3:?istore_2
          ?? 4:?iinc?1, 1? i++
          ? 7? ?iload_1 從局部變量1中裝載int類(lèi)型值。
          ?? 8:?iconst_2
          ?? 9:?imul
          ?? 10:?istore_1
          ?? 11:?goto?4
          ? LineNumberTable:
          ?? line 3: 0? 源代碼第3行對(duì)應(yīng)Code中的0偏移量。
          ?? line 4: 2
          ?? line 6: 4
          ?? line 7: 7
          ?? line 8: 11

          }

          posted on 2006-11-01 21:30 王某某 閱讀(2468) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 深入Java虛擬機(jī)

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永清县| 襄樊市| 明溪县| 赞皇县| 巴马| 双辽市| 台北县| 芷江| 平果县| 平潭县| 苍山县| 凤翔县| 商洛市| 潼关县| 汉川市| 临澧县| 宁南县| 商河县| 勃利县| 礼泉县| 库尔勒市| 阿合奇县| 霍城县| 综艺| 大竹县| 天门市| 通渭县| 南宁市| 都安| 平阴县| 施甸县| 库尔勒市| 苏州市| 从江县| 高邮市| 鹿邑县| 揭西县| 安远县| 德江县| 蒙山县| 卢龙县|