Junky's IT Notebook

          統計

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評論排行榜

          《深入JAVA虛擬機》筆記(一)

          ? 看了第6章的java class文件這一部分,我覺得對class文件有進一步的了解。于是想作一點筆記,以備以后查時方便。
          ????? 這章的一個例子雖然簡單,但是我覺的很有一定代表性。例子如下:

          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"?????
          因為編譯原文件不一定必須與java語言相關,可以使用其他語言來編寫程序,然后將其編譯為class文件,所以這里要寫上Act.java而不是Act. 呵呵,想來以前為什么javac 來編譯源文件時一定要加.java,而java 執行時就不需要加.java了,當時就是搞不懂,現在明白了。
          class Act extends java.lang.Object
          ? SourceFile: "Act.java"
          SourceFile屬性,它提供了產生class文件的源文件的名稱,它是一個可選的項,為什么說它是可選項的,因為class可以自己用UE等工具寫。
          ? minor version: 0
          ? major version: 49
          版本號:我用的是5.0的,出來的major version 是49,書上說1.0或1.2是45,1.4我想可能是48?吧。呵呵,還沒有試過。
          ? Constant pool:
          這個是常量池,剛看書的時候我還以為常量池放的一定是常量。錯。
          常量池就是該類型所用常量的一個有序集合,包括直接常量(String,integer,floating??point常量)和對其他類型、字段和方法的符號引用。
          const #1 = Method?#3.#12;?//? java/lang/Object."<init>":()V
          因為Constant pool#0是不用的,所以只能從#1開始,但不知為什么第一個是Method而不是class,我現在還不明白。
          const #2 = class?#13;?//? Act
          CONSTANT_Class是對一個類或接口的符號引用。這個是指向#13
          const #3 = class?#14;?//? java/lang/Object
          const #4 = Asciz?<init>;
          ?這個Asciz應該表示是CONSTANT_Utf8吧,因為C?ONSTANT_Utf8可以是存儲四種基本信息類型:文字字符串、被定義的類和接口描述、對其他類或接口的符號引用以及屬性相關的字符串。
          <init>是實例的初始化方法,是實例調用方法前必須要<init>的,
          <clinit>是類的初始化方法。
          const #5 = Asciz?()V;
          此<init>的描述符,()V表示<init>沒有帶參數,返回的是void型的。
          書上介紹:
          ()I? int getSize()??
          () Ljava/lang/String????? String toString()

          const #6 = Asciz?Code;
          Code在所有不是抽象或者本地方法的method_info信息中,都存在一個Code_attribute表。
          但是我試一下在抽象的方法中同樣也有code的啊,不懂中。
          const #7 = Asciz?LineNumberTable;
          LineNumberTable屬性建立了方法字節碼流偏移量和源代碼行號之間的映射關系。關于這一點,我在下面詳細談到。
          const #8 = Asciz?doMathForever;
          const #9 = Asciz?(I)V;
          const #10 = Asciz?SourceFile;
          const #11 = Asciz?Act.java;
          const #12 = NameAndType?#4:#5;//? "<init>":()V
          NameAndType指向字段或者方法的符號引用的一部分。為什么沒有指向#8,#9呢?不懂中。
          const #13 = Asciz?Act;
          const #14 = Asciz?java/lang/Object;

          {
          Act();
          ? Code:
          ?? Stack=1, Locals=1, Args_size=1
          需要的棧為1個,只是this的存取;本地變量為1個,也是this,方法的參數是1個,也是this傳入。
          ?? 0:?aload_0
          從局部變量0中裝載引用類型。
          ?? 1:?invokespecial?#1; //Method java/lang/Object."<init>":()V
          調用Object的<init>方法,因為每個類都是繼承Object,所以實例時都要調用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類型值。
          ?? 8:?iconst_2
          ?? 9:?imul
          ?? 10:?istore_1
          ?? 11:?goto?4
          ? LineNumberTable:
          ?? line 3: 0? 源代碼第3行對應Code中的0偏移量。
          ?? line 4: 2
          ?? line 6: 4
          ?? line 7: 7
          ?? line 8: 11

          }

          posted on 2006-06-02 00:10 junky 閱讀(277) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 溧水县| 桑日县| 曲周县| 太白县| 曲麻莱县| 壶关县| 清水县| 巴中市| 建宁县| 修武县| 彰武县| 商洛市| 铜山县| 宣汉县| 威海市| 维西| 武宁县| 崇信县| 舟曲县| 黄石市| 楚雄市| 大安市| 临沂市| 大埔县| 两当县| 称多县| 盘锦市| 大庆市| 新巴尔虎左旗| 昌图县| 德惠市| 页游| 玉龙| 尼木县| 沂南县| 克山县| 潼关县| 微山县| 扬中市| 堆龙德庆县| 盐边县|