14.3バイトコード分析
14219 ワード
最初のバイトコード解析
セカンドバイトコード解析
3バイト目のコード解析
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