14.3バイトコード分析

14219 ワード

最初のバイトコード解析
package com.zj.study.jvm.bytecode;

/*
    javap jdk        。        class     ,          code (    )、     、             、       。
    -v -verbose,      (    、     ,        )
    -c,        
    javap com.zj.study.jvm.bytecode.MyTest1
    javap -c com.zj.study.jvm.bytecode.MyTest1
    javap -verbose com.zj.study.jvm.bytecode.MyTest1

    Hex Fiend mac 16     

 */
public class MyTest1 {
    private int a = 1;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

CA FE BA BE //   
00 00 00 32 // 00 00      00 32     
00 18 // 1 * 16 + 8 -1 = 23   
0A 00 04 00 14 // 0A = 10         ,00 04               4 ,00 14 = 20                
09 00 03 00 15 // 09 = 9         ,00 03                   3 ,00 15 = 21            21
07 00 16 // 07 = 7        ,00 16 = 22             
07 00 17 // 07 = 7        ,00 17 = 23             
01 00 01 61 // 01 = 1       utf-8        ,00 01 = 1    length=1 utf-8      ,61     a
01 00 01 49 // 01 = 1       utf-8        ,00 01 = 1    length=1 utf-8      ,49     I
01 00 06 3C 69 6E 69 74 3E // 01 = 1       utf-8        ,00 06 = 6    length=6 utf-8      ,    
01 00 03 28 29 56 // 01 = 1       utf-8        ,00 03 = 3    length=3 utf-8      ,    ()V
01 00 04 43 6F 64 65 // 01 = 1       utf-8        ,00 04 = 4    length=4 utf-8      ,    Code
01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 //    LineNumberTable
01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 //    LocalVariableTable
01 00 04 74 68 69 73 //    this
01 00 23 4C 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 31 3B //    Lcom/zj/study/jvm/bytecode/MyTest1;
01 00 04 67 65 74 41 //    getA
01 00 03 28 29 49 //    ()I 
01 00 04 73 65 74 41 //    setA
01 00 04 28 49 29 56 //    (I)V
01 00 0A 53 6F 75 72 63 65 46 69 6C 65 //    SourceFile
01 00 0C 4D 79 54 65 73 74 31 2E 6A 61 76 61 0C 00 //    MyTest1.java
07 00 08 // 07 = 6        ,00 08 = 8             
0C 00 05 00 06 // 0C=12             ,00 05=5,                ,00 06=6                
01 00 21 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 31 //    com/zj/study/jvm/bytecode/MyTest1
01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 //    java/lang/Object
00 21 //      access_flag
00 03 //        ,     
00 04 //        ,     
00 00 //      0       
00 01 // fields_count      
00 02 00 05 00 06 00 00 // 00 02      ,00 05     ,00 06       ,00 00       

00 03 //    3   

00 01 //            
00 07 //      
00 08 //     
00 01 //        1 
00 09 //                   
00 00 00 38 //                
00 02 // max_stack
00 01 // max_locals
00 00 00 0A // code_length
2A B7 00 01 2A 04 B5 00 02 B1 //         
00 00 //      
00 02 //            
00 0A //            LineNumberTable
00 00 00 0A //    10
00 02 00 00 00 0E 00 04 00 0F // 00 02 lineNumberTable   ,00 00          ,00 0E        
00 0B //            LocalVariableTable
00 00 00 0C //   
00 01 // local_variable_table_length
00 00 00 0A 00 0C 00 0D 00 00 // 00 00                  ,00 0A            ,00 0C           ,00 0D             , 00 00                    

00 01 //            
00 0E //      
00 0F //     
00 01 //        1 
00 09 //                  
00 00 00 2F //                 47
00 01 // max_stack
00 01 // max_locals
00 00 00 05 // code_length
2A B4 00 02 AC //         
00 00 //      
00 02 //            
00 0A //            LineNumberTable
00 00 00 06 //    6
00 01 00 00 00 12 // 00 01 lineNumberTable   ,00 00          ,00 12        
00 0B //            LocalVariableTable
00 00 00 0C //   
00 01 // local_variable_table_length
00 00 00 05 00 0C 00 0D 00 00 // 00 00                  ,00 05            ,00 0C           ,00 0D             , 00 00                    

00 01 //            
00 10 //      
00 11 //     
00 01 //        1 
00 09 //                  
00 00 00 3E //                 62
00 02 
00 02 
00 00 00 06 
2A 1B B5 00 02 B1 
00 00 
00 02 
00 0A 
00 00 00 0A 
00 02 00 00 00 16 00 05 00 17 
00 0B 
00 00 00 16 
00 02 
00 00 00 06 00 0C 00 0D 00 00 00 00 00 06 00 05 00 06 00 01 

00 01 //       1 
00 12 //           
00 00 00 02 //          
00 13 //         

セカンドバイトコード解析
package com.zj.study.jvm.bytecode;

public class MyTest2 {
    String str = "Welcome";
    private int x = 5;
    public static Integer in = 10;

    public MyTest2() {
    }

    public static void main(String[] args) {
        MyTest2 myTest2 = new MyTest2();
        myTest2.setX(8);
        in = 20;
    }

    public void setX(int x) {
        this.x = x;
    }
}
CA FE BA BE //   
00 00 00 32 //          
00 2F //       = 2 * 16 + 15 - 1 = 46
0A 00 0A 00 22 //    1                   10            34
08 00 23 //    2           35
09 00 05 00 24 //    3                    5            36
09 00 05 00 25 //    4                     5            37
07 00 26 //    5              38
0A 00 05 00 22 //    6                   5            34
0A 00 05 00 27 //    7                   5            39
0A 00 28 00 29 //    8                   40            41
09 00 05 00 2A //    9                    5            42
07 00 2B //    10              43
01 00 03 73 74 72 //    11        3    str
01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B //    12        18    Ljava/lang/String;
01 00 01 78 //    13        1    x
01 00 01 49 //    14        1    I
01 00 02 69 6E //    15        2    in
01 00 13 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B //    16        19    Ljava/lang/Integer;
01 00 06 3C 69 6E 69 74 3E //    17        6    
01 00 03 28 29 56 //    18        3    ()V
01 00 04 43 6F 64 65 //    19        4    Code
01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 //    20        15    LineNumberTable
01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 //    21        18    LocalVariableTable
01 00 04 74 68 69 73 //    22        4    this
01 00 23 4C 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 3B //    23        35    Lcom/zj/study/jvm/bytecode/MyTest2;
01 00 04 6D 61 69 6E //    24        4    main
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 //    25        22    ([Ljava/lang/String;)V
01 00 04 61 72 67 73 //    26        4    args
01 00 13 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B //    27        19    [Ljava/lang/String;
01 00 07 6D 79 54 65 73 74 32 //    28        7    myTest2
01 00 04 73 65 74 58 //    29        4    setX
01 00 04 28 49 29 56 //    30        4    (I)V
01 00 08 3C 63 6C 69 6E 69 74 3E //    31        8    
01 00 0A 53 6F 75 72 63 65 46 69 6C 65 //    32        10    SourceFile
01 00 0C 4D 79 54 65 73 74 32 2E 6A 61 76 61 //    33        12    MyTest2.java
0C 00 11 00 12 //    34                         17                  18
01 00 07 57 65 6C 63 6F 6D 65 //    35        7    Welcome
0C 00 0B 00 0C //    36                         11                  12
0C 00 0D 00 0E //    37                         13                  14
01 00 21 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 //    38        33    com/zj/study/jvm/bytecode/MyTest2
0C 00 1D 00 1E //    39                         29                  30
07 00 2C //    40              44
0C 00 2D 00 2E //    41                         45                  46
0C 00 0F 00 10 //    42                         15                  16
01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 //    43        16    java/lang/Object
01 00 11 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 //    44        17    java/lang/Integer
01 00 07 76 61 6C 75 65 4F 66 //    45        7    valueOf
01 00 16 28 49 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B //    46        22    (I)Ljava/lang/Integer;
00 21 //      
00 05 //             5
00 0A //            10
00 00 //     
00 03 //        3
00 00 00 0B 00 0C 00 00 2         2        2         2               
00 02 00 0D 00 0E 00 00 
00 09 00 0F 00 10 00 00 
00 04 // 4    
00 01 //            
00 11 //           
00 12 //            
00 01 //             
00 13 //                  
00 00 00 42 //               
00 02 
00 01 
00 00 00 10 
2A B7 00 01 2A 12 02 B5 00 03 2A 08 B5 00 04 B1 
00 00 
00 02 
00 14 
00 00 00 0E 
00 03 00 00 00 03 00 04 00 04 00 0A 00 05 
00 15 
00 00 00 0C 
00 01 00 00 00 10 00 16 00 17 00 00 

00 09 //            
00 18 //     
00 19 //      
00 01 //     
00 13 // Code
00 00 00 57 //   
00 02 
00 02 
00 00 00 17 
BB 00 05 59 B7 00 06 4C 2B 10 08 B6 00 07 10 14 B8 00 08 B3 00 09 B1 
00 00 
00 02 
00 14 
00 00 00 12 
00 04 00 00 00 0A 00 08 00 0B 00 0E 00 0C 00 16 00 0D 
00 15 
00 00 00 16 
00 02 00 00 00 17 00 1A 00 1B 00 00 00 08 00 0F 00 1C 00 17 00 01

00 01 
00 1D 
00 1E 
00 01 
00 13 
00 00 00 3E 
00 02 
00 02 
00 00 00 06 
2A 1B B5 00 04 B1 
00 00 
00 02 
00 14 
00 00 00 0A 
00 02 00 00 00 10 00 05 00 11 
00 15 
00 00 00 16 
00 02 00 00 00 06 00 16 00 17 00 00 00 00 00 06 00 0D 00 0E 00 01 

00 08 
00 1F 
00 12 
00 01 
00 13 
00 00 00 21 
00 01 
00 00 
00 00 00 09 
10 0A B8 00 08 B3 00 09 B1 
00 00 
00 01 
00 14 
00 00 00 06
00 01 00 00 00 07 

00 01 
00 20 
00 00 00 02 
00 21

3バイト目のコード解析
package com.zj.study.jvm.bytecode;

public class MyTest2 {
    String str = "Welcome";
    private int x = 5;

    public static Integer in = 10;

    public static void main(String[] args) {
        MyTest2 myTest2 = new MyTest2();
        myTest2.setX(8);
        in = 20;
    }

    public synchronized void setX(int x) {
        this.x = x;
    }

    private void test(String test) {
        synchronized (this.str) {
            System.out.println("Hello World");
        }
    }

    private synchronized static void test2() {
        
    }
}
CA FE BA BE 
00 00 00 32 
00 46 // 4 * 16 + 6 - 1 = 69

0A 00 0D 00 2D 
08 00 2E 
09 00 05 00 2F 
09 00 05 00 30 
07 00 31 
0A 00 05 00 2D 
0A 00 05 00 32 
0A 00 33 00 34 
09 00 05 00 35 
09 00 36 00 37 
08 00 38 
0A 00 39 00 3A 
07 00 3B 
01 00 03 73 74 72 
01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 
01 00 01 78 
01 00 01 49 
01 00 02 69 6E 
01 00 13 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B 
01 00 06 3C 69 6E 69 74 3E 
01 00 03 28 29 56 
01 00 04 43 6F 64 65 
01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 
01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 
01 00 04 74 68 69 73 
01 00 23 4C 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 3B 
01 00 04 6D 61 69 6E 
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 
01 00 04 61 72 67 73 
01 00 13 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 
01 00 07 6D 79 54 65 73 74 32 
01 00 04 73 65 74 58 
01 00 04 28 49 29 56 
01 00 04 74 65 73 74 
01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 
01 00 0D 53 74 61 63 6B 4D 61 70 54 61 62 6C 65 
07 00 31 
07 00 3C 
07 00 3B 
07 00 3D 
01 00 05 74 65 73 74 32 
01 00 08 3C 63 6C 69 6E 69 74 3E 
01 00 0A 53 6F 75 72 63 65 46 69 6C 65 
01 00 0C 4D 79 54 65 73 74 32 2E 6A 61 76 61 
0C 00 14 00 15 
01 00 07 57 65 6C 63 6F 6D 65 
0C 00 0E 00 0F 
0C 00 10 00 11 
01 00 21 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 
0C 00 20 00 21 
07 00 3E 
0C 00 3F 00 40 
0C 00 12 00 13 
07 00 41 
0C 00 42 00 43 
01 00 0B 48 65 6C 6C 6F 20 57 6F 72 6C 64 
07 00 44 
0C 00 45 00 23 
01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 
01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 
01 00 13 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 
01 00 11 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 
01 00 07 76 61 6C 75 65 4F 66 
01 00 16 28 49 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B 
01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 65 6D 
01 00 03 6F 75 74 
01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 3B 
01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 
01 00 07 70 72 69 6E 74 6C 6E 

00 21 
00 05 
00 0D 
00 00 //     
00 03 // 3   
00 00 00 0E 00 0F 00 00 
00 02 00 10 00 11 00 00 
00 09 00 12 00 13 00 00 

00 06 // 6    

00 01 
00 14 
00 15 
00 01 
00 16 // Code
00 00 00 42 
00 02 
00 01 
00 00 00 10 
2A B7 00 01 2A 12 02 B5 00 03 2A 08 B5 00 04 B1 
00 00 
00 02 
00 17 // LineNumberTable
00 00 00 0E 
00 03 00 00 00 03 00 04 00 04 00 0A 00 05 
00 18 // LocalVariableTable
00 00 00 0C 
00 01 00 00 00 10 00 19 00 1A 00 00 

00 09 
00 1B 
00 1C 
00 01 
00 16 // Code
00 00 00 57 
00 02 
00 02 
00 00 00 17 
BB 00 05 59 B7 00 06 4C 2B 10 08 B6 00 07 10 14 B8 00 08 B3 00 09 B1 
00 00 
00 02 
00 17 
00 00 00 12 
00 04 00 00 00 0A 00 08 00 0B 00 0E 00 0C 00 16 00 0D 
00 18 
00 00 00 16 
00 02 00 00 00 17 00 1D 00 1E 00 00 00 08 00 0F 00 1F 00 1A 00 01 

00 21 
00 20 
00 21 
00 01 
00 16 
00 00 00 3E 
00 02 
00 02 
00 00 00 06 
2A 1B B5 00 04 B1 
00 00 
00 02 
00 17 
00 00 00 0A 
00 02 00 00 00 10 00 05 00 11 
00 18 
00 00 00 16 
00 02 00 00 00 06 00 19 00 1A 00 00 00 00 00 06 00 10 00 11 00 01 

00 02 
00 22 
00 23 
00 01 
00 16 
00 00 00 88 
00 02 
00 04 
00 00 00 1A 
2A B4 00 03 59 4D C2 B2 00 0A 12 0B B6 00 0C 2C C3 A7 00 08 4E 2C C3 2D BF B1 
00 02 //   
00 07 00 11 00 14 00 00 
00 14 00 17 00 14 00 00 
00 03 
00 17 
00 00 00 12 
00 04 00 00 00 14 00 07 00 15 00 0F 00 16 00 19 00 17 
00 18 
00 00 00 16 
00 02 00 00 00 1A 00 19 00 1A 00 00 00 00 00 1A 00 22 00 0F 00 01 
00 24 //StackMapTable
00 00 00 18 
00 02 FF 00 14 00 03 07 00 25 07 00 26 07 00 27 00 01 07 00 28 FA 00 04 

00 2A 
00 29 
00 15 
00 01 
00 16 // Code
00 00 00 19 
00 00 
00 00 
00 00 00 01 
B1 
00 00 
00 01 
00 17 // LineNumberTable
00 00 00 06 
00 01 00 00 00 1B 

00 08 
00 2A 
00 15 
00 01 
00 16 // Code
00 00 00 21 
00 01 
00 00 
00 00 00 09 
10 0A B8 00 08 B3 00 09 B1 
00 00 
00 01 
00 17 // LineNumberTable
00 00 00 06 
00 01 00 00 00 07 

00 01 
00 2B // SourceFile
00 00 00 02 
00 2C // MyTest2.java