1. 最简单的一段java代码
public class Test1 {
public int getNum(int i) {
return i + 1;
}
}
对编译之后的class文件,用javap分析该文件,得出的伪机器码
下面对机器码分析
public class Test1 extends java.lang.Object
SourceFile: "Test1.java"
minor version: 0
major version: 50
//这是常量池,进入JVM之后,会被储存在PermArea里
Constant pool:
const #1 = class #2; // Test1
const #2 = Asciz Test1;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz <init>;
const #6 = Asciz ()V;
const #7 = Asciz Code;
const #8 = Method #3.#9; // java/lang/Object."<init>":()V
const #9 = NameAndType #5:#6;// "<init>":()V
const #10 = Asciz LineNumberTable;
const #11 = Asciz LocalVariableTable;
const #12 = Asciz this;
const #13 = Asciz LTest1;;
const #14 = Asciz getNum;
const #15 = Asciz (I)I;
const #16 = Asciz i;
const #17 = Asciz I;
const #18 = Asciz SourceFile;
const #19 = Asciz Test1.java;
{
//构造函数
//线程stack只有一层
//有一个变量 就是this变量
public Test1();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 2: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTest1;
//自定义方法,stack两层
public int getNum(int);
Code:
Stack=2, Locals=2, Args_size=2
//以下是逻辑代码的解释
//首先加载变量
//然后赋值1
//然后加
//然后返回
0: iload_1
1: iconst_1
2: iadd
3: ireturn
LineNumberTable:
line 4: 0
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 this LTest1;
0 4 1 i I
}
2. 代码稍微复杂一点
加上异常处理和对象
import java.io.File;
public class Test1 {
public int getNum(int i) {
try {
new File("xxx.xxx");
for (int k = 0; k < i; i++) {
i = i + 1;
}
return i;
} catch (Exception e) {
return 1;
}finally{
}
}
}
Javap分析之后的机器码
public class Test1 extends java.lang.Object
SourceFile: "Test1.java"
minor version: 0
major version: 50
//常量池,不废话
Constant pool:
const #1 = class #2; // Test1
const #2 = Asciz Test1;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz <init>;
const #6 = Asciz ()V;
const #7 = Asciz Code;
const #8 = Method #3.#9; // java/lang/Object."<init>":()V
const #9 = NameAndType #5:#6;// "<init>":()V
const #10 = Asciz LineNumberTable;
const #11 = Asciz LocalVariableTable;
const #12 = Asciz this;
const #13 = Asciz LTest1;;
const #14 = Asciz getNum;
const #15 = Asciz (I)I;
const #16 = class #17; // java/io/File
const #17 = Asciz java/io/File;
const #18 = String #19; // xxx.xxx
const #19 = Asciz xxx.xxx;
const #20 = Method #16.#21; // java/io/File."<init>":(Ljava/lang/St
ring;)V
const #21 = NameAndType #5:#22;// "<init>":(Ljava/lang/String;)V
const #22 = Asciz (Ljava/lang/String;)V;
const #23 = class #24; // java/lang/Exception
const #24 = Asciz java/lang/Exception;
const #25 = Asciz i;
const #26 = Asciz I;
const #27 = Asciz k;
const #28 = Asciz e;
const #29 = Asciz Ljava/lang/Exception;;
const #30 = Asciz StackMapTable;
const #31 = Asciz SourceFile;
const #32 = Asciz Test1.java;
{
//构造函数 不废话
public Test1();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTest1;
public int getNum(int);
Code:
Stack=2, Locals=3, Args_size=2
//new ? jvm自带的机器码?
0: new #16; //class java/io/File
3: ldc #18; //String xxx.xxx
5: invokespecial #20; //Method java/io/File."<init>":(Ljava/lang/String;)
V
8: iconst_0
9: istore_2
10: goto 19
// i自加1
13: iinc 1, 1
//k自加1
16: iinc 1, 1
//加载i变量
19: iload_2
//加载k变量
20: iload_1
//如果k<I 接着循环
21: if_icmplt 13
//加载变量I 并且返回
24: iload_1
25: ireturn
//返回常量1
26: astore_2
27: iconst_1
28: ireturn
//异常表
Exception table:
//25行到26行之间捕获异常
from to target type
0 25 26 Class java/lang/Exception
LineNumberTable:
line 6: 0
line 7: 8
line 8: 13
line 7: 16
line 10: 24
line 11: 26
line 12: 27
LocalVariableTable:
Start Length Slot Name Signature
0 29 0 this LTest1;
0 29 1 i I
10 14 2 k I
27 2 2 e Ljava/lang/Exception;
StackMapTable: number_of_entries = 3
frame_type = 252 /* append */
offset_delta = 13
locals = [ int ]
frame_type = 5 /* same */
frame_type = 255 /* full_frame */
offset_delta = 6
locals = [ class Test1, int ]
stack = [ class java/lang/Exception ]
}
以上 疯狂的加班中