• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    在軟件測試中淺談JAVA CLASS文件結構

    發布: 2010-7-28 10:10 | 作者: 網絡轉載 | 來源: 領測軟件測試網編輯 | 查看: 224次 | 進入軟件測試論壇討論

    領測軟件測試網

    對于constantvalue_index意義如下:
    long CONSTANT_Long 
    float CONSTANT_Float 
    double CONSTANT_Double 
    int, short, char, byte, boolean CONSTANT_Integer 
    String CONSTANT_String 
    ConstantValue用于field_info 中,用于描述一個static常量,
    且此時field_info的access_flags應為ACC_STATIC 
    3. Code : attribute_info被替代為:
    Code_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 max_stack; //執行此函數時可用的棧的最大深度
    u2 max_locals; //執行此函數可用到的最大本地變量數目,包括參數。
    // 注意:一個long/double相當于2個變量數目.
    u4 code_length; //本函數用到的代碼長度。
    u1 code[code_length]; //實現本函數的真正字節碼
    u2 exception_table_length;
    { u2 start_pc;
    u2 end_pc; //捕獲違例時執行代碼數組中的[start_pc, end_pc)部分
    u2 handler_pc; //現在還不大明白他是干嘛的!!
    u2 catch_type; //指向constant_pool的索引,對應CONSTANT_Class_info 
    }exception_table[exception_table_length];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
    }
    CONSTANT_Class_info {
    u1 tag; //必須為CONSTANT_Class (7)
    u2 name_index; //不用我再說了吧?
    }
    Code屬性用于method_info結構中。
    4. Exceptions : attribute_info被替代為:
    Exceptions_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 number_of_exceptions;
    u2 exception_index_table[number_of_exceptions];
    }
    5. InnerClasses : attribute_info被替代為:
    InnerClasses_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 number_of_classes;
    { u2 inner_class_info_index; 
    u2 outer_class_info_index; 
    u2 inner_name_index; 
    u2 inner_class_access_flags; 
    } classes[number_of_classes];
    }
    6. Synthetic : attribute_info被替代為:
    Synthetic_attribute {
    u2 attribute_name_index; //不用廢話了吧?
    u4 attribute_length; //必須為0
    }
    Synthetic用在 field_info、 method_info 中,
    一個沒有出現在源程序中的變量必須使用Synthetic標記。
    7. LineNumberTable : attribute_info被替代為:
    LineNumberTable_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 line_number_table_length;
    { u2 start_pc; //代碼數組中的開始處
    u2 line_number; //源文件中的行號(對于每一非空行都有這么一項) 
    } line_number_table[line_number_table_length];
    }
    LineNumberTable用于Code屬性中,通常用于調試。
    8. LocalVariableTable : attribute_info被替代為:
    LocalVariableTable_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 local_variable_table_length;
    { u2 start_pc;
    u2 length; //當解釋到代碼數組的[start_pc,start_pc+length]
    //時變量必須被賦值??
    u2 name_index;
    u2 descriptor_index;
    u2 index; //到本地變量數組的一個索引
    } local_variable_table[local_variable_table_length];

    9. Deprecated : attribute_info被替代為:
    Deprecated_attribute {
    u2 attribute_name_index;
    u4 attribute_length; //必須為0
    }
    當然你也可以定義自己的屬性,但要你自己的編譯器和虛擬機實現。JVM將忽略自己不認可的屬性。
    來實踐一下吧!
    編寫一個最簡單的程序:
    class Test 
    {
    public static void main(String[] args) 
    {
    System.out.println("Hello World!");
    }
    }
    c:\work>javac Test.java
    c:\work>filedump Test.class
    File Dump V0.3 Beta by cloud (safesuite@363.net).
    01:00 ca fe ba be 00 03 00 2d 00 1d 0a 00 06 00 0f 09 .......-........
    01:01 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 ................
    01:02 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 .....<init>...()
    01:03 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e V...Code...LineN
    01:04 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 umberTable...mai
    01:05 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 n...([Ljava/lang
    01:06 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 /String;)V...Sou
    01:07 72 63 65 46 69 6c 65 01 00 09 54 65 73 74 2e 6a rceFile...Test.j
    >d
    02:00 61 76 61 0c 00 07 00 08 07 00 17 0c 00 18 00 19 ava.............
    02:01 01 00 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 ...Hello World!.
    02:02 00 1a 0c 00 1b 00 1c 01 00 04 54 65 73 74 01 00 ..........Test..
    02:03 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 .java/lang/Objec
    02:04 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 t...java/lang/Sy
    02:05 73 74 65 6d 01 00 03 6f 75 74 01 00 15 4c 6a 61 stem...out...Lja
    02:06 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 va/io/PrintStrea
    02:07 6d 3b 01 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 m;...java/io/Pri
    >d
    03:00 6e 74 53 74 72 65 61 6d 01 00 07 70 72 69 6e 74 ntStream...print
    03:01 6c 6e 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 ln...(Ljava/lang
    03:02 2f 53 74 72 69 6e 67 3b 29 56 00 20 00 05 00 06 /String;)V. ....
    03:03 00 00 00 00 00 02 00 00 00 07 00 08 00 01 00 09 ................
    03:04 00 00 00 1d 00 01 00 01 00 00 00 05 2a b7 00 01 ............*...
    03:05 b1 00 00 00 01 00 0a 00 00 00 06 00 01 00 00 00 ................
    03:06 01 00 09 00 0b 00 0c 00 01 00 09 00 00 00 25 00 ..............%.
    03:07 02 00 01 00 00 00 09 b2 00 02 12 03 b6 00 04 b1 ................
    >d
    04:00 00 00 00 01 00 0a 00 00 00 0a 00 02 00 00 00 05 ................
    04:01 00 08 00 06 00 01 00 0d 00 00 00 02 00 0e ..............
    >
    解讀一下:
    ca fe ba be magic
    00 03 00 2d 次主版本號,換算一下: 45.3 (注意,不是高字節在前,別犯職業!)
    00 1d constant_pool元素個數加一 : 29 那么constant_pool就是[1-28]
    constant_pool: 1-28
    1. 0a 00 06 00 0f 
    0x0a :CONSTANT_InterfaceMethodref 0x06 :class index 0x0f :name-type-index
    2. 09 00 10 00 11
    0x09 : CONSTANT_Fieldref 0x10: . . . 0x11 : . . . .
    3. 08 00 12 0x08 : CONSTANT_String 0x12 : string_index
    4. 0a 00 13 00 14 0x0a同于1.
    5. 07 00 15 0x07 : CONSTANT_Class 0x15 : name_index
    6. 07 00 16 
    7. 01 00 06 3c 69 6e 69 74 3e 01 ...<init> 
    0x01 CONSTANT_Utf8 0x06 : string length "<init>" : 構造函數
    8. 01 00 03 28 29 56 ...()V 函數,無參數
    0x01 . . . . . . 0x03 : . . . . "()V" : . . .
    9. 01 00 04 43 6f 64 65 ...Code
    10. 01 00 0f 4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 ...LineNumberTable
    11. 01 00 04 6d 61 69 6e ...main
    12. 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 
    ...([Ljava/lang/String;)
    V 函數,參數為String[]類型
    13. 01 00 0a 53 6f 75 72 63 65 46 69 6c 65 ...SourceFile
    14. 01 00 09 54 65 73 74 2e 6a 61 76 61 ...Test.java
    15. 0c 00 07 00 08 0x0c:CONSTANT_NameAndType 07 : name-index 08:name-type-index
    16. 07 00 17
    17. 0c 00 18 00 19
    18. 01 00 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 ...Hello World!
    19. 07 00 1a
    20. 0c 00 1b 00 1c
    21. 01 00 04 54 65 73 74 ...Test
    22. 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 ...java/lang/Object
    23. 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d ...java/lang/System
    24. 01 00 03 6f 75 74 ...out
    25. 01 00 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b
    ...Ljava/io/PrintStream;
    26. 01 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d...java/io/PrintStream
    27. 01 00 07 70 72 69 6e 74 6c 6e ...println
    28. 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56
    ...(Ljava/lang/String;)V
    00 20 access_flags 
    00 05 this_class
    00 06 super_class
    00 00 interfaces_count
    00 00 fields_count
    00 02 methods_count
    methods[2]:
    method_info {
    u2 access_flags;
    u2 name_index; 
    u2 descriptor_index;
    u2 attributes_count;
    attribute_info attributes[attributes_count];
    }
    0. 00 00 access_flags;
    00 07 name_index; 看看constant_pool的第7項: <init> 表明當前描述構造函數
    00 08 descriptor_index;
    00 01 attributes_count;
    00 09 attribute_name_index 0x09 看看constant_pool的第9項,簡單明了Code ! 
    00 00 00 1d attribute_length = 29
    00 01 max_stack
    00 01 max_locals
    00 00 00 05 code_length
    2a b7 00 01 b1 JVM定義的操作碼代碼段數組
    00 00 exception_table_length
    00 01 attributes_count 一個,接下來是attribute_info結構
    00 0a attribute_name_index 看看constant_pool的第10項: LineNumberTable(顯然調試用)
    00 00 00 06 attribute_length
    00 01 line_number_table_length
    00 00 start_pc
    00 01 line_number
    1. 00 09 access_flags PUBLIC & STATIC
    00 0b name_index; 表明當前描述main函數
    00 0c descriptor_index; ...([Ljava/lang/String;)V
    00 01 attributes_count;
    00 09 attribute_name_index Code
    00 00 00 25 attribute_length = 37
    00 02 max_stack
    00 01 max_locals 
    00 00 00 09 code_length
    b2 00 02 12 03 b6 00 04 b1 代碼數組 codeArray1[0-8]
    00 00 exception_table_length
    00 01 attributes_count 接下來是attribute_info結構
    00 0a attribute_name_index LineNumberTable
    00 00 00 0a attribute_length
    00 02 line_number_table_length
    00 00 start_pc
    00 05 line_number
    00 08 start_pc : codeArray1[8] = 0xb1 --> return
    00 06 line_number 第6行源程序為 }
    00 01 attributes_count
    00 0d attribute_name_index 屬性為SourceFile
    00 00 00 02 attribute_length
    00 0e sourcefile_index constant_pool[0x0e] --- > "Test.java"
    接下來我們看看main()函數對應的代碼:
    b2 00 02 12 03 b6 00 04 b1
    0xb2 0x00 0x02 : getstatic #2
    看看constant_pool[0x02] :09 00 10 00 11
    0x09 : CONSTANT_Fieldref 0x10: class index 0x11 :name-type-index
    constant_pool[0x10]: --> constant_pool[0x17] : java/lang/System
    constant_pool[0x11]: 0x18 : class index 0x19 :name-type-index
    constant_pool[0x18] : out
    constant_pool[0x19] : Ljava/io/PrintStream
    即 System.out 為 java.io.PrintStream 類型
    0x12 0x03 : ldc #3
    看看 constant_pool[3] : 08 00 12 0x08 : CONSTANT_String 0x12 : string_index
    指向一個字符串 constant_pool[0x12]: "Hello World!"
    故該指令加載了字符串索引到本地棧
    0xb6 0x00 0x04: invokevirtual #4 
    ------->到constant_pool查查 0x13 :class 0x14 :name-type
    看看constant_pool[0x13]:java/io/PrintStream
    constant_pool[20] :--> 00 1b 00 1c
    constant_pool[0x1b]:println
    . . . . :(Ljava/lang/String;)V
    故該指令調用了 java.io.PrintStream.println(java.lang.String)
    而參數則為 ldc #3 加載的 "Hello World!"
    0xb1 : return

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    22/2<12

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>