当我们编写Java代码并使用编译器将其编译为字节码文件后,我们有时需要查看生成的字节码以便于了解程序实际执行的内容。下面是查看Java字节码的步骤:
第一步:编译java文件为字节码文件
在终端或命令行界面中进入Java源代码所在目录,使用javac命令将java源文件编译为字节码文件。例如:
javac HelloWorld.java
完成后会在当前目录下生成与源文件同名的.class文件。
第二步:使用javap命令查看字节码
在终端或命令行界面中进入.class文件所在目录,使用javap命令查看字节码。例如:
javap -c HelloWorld
-c选项表示将输出信息以字节码指令的形式显示出来。这样我们就可以看到字节码文件具体的指令、操作数以及跳转信息等等。
示例1:
Java源代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
使用javac命令编译后,在当前目录下会生成HelloWorld.class文件。使用javap命令查看字节码:
$ javap -c HelloWorld
Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String Hello, world!
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
可以看到,在main方法中,使用getstatic指令获取了java/lang/System.out对象,然后使用ldc指令将字符串Hello, world!加载到操作数栈中,最后使用invokevirtual指令调用了PrintStream的println方法,将字符串打印输出。
示例2:
Java源代码:
public class SimpleCalc {
public static void main(String[] args) {
int a = 3;
int b = 5;
int c = a + b;
System.out.println("Result: " + c);
}
}
使用javac命令编译后,在当前目录下会生成SimpleCalc.class文件。使用javap命令查看字节码:
$ javap -c SimpleCalc
Compiled from "SimpleCalc.java"
public class SimpleCalc {
public SimpleCalc();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_1
2: iconst_5
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_3
8: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
11: new #13 // class java/lang/StringBuilder
14: dup
15: invokespecial #17 // Method java/lang/StringBuilder."<init>":()V
18: ldc #19 // String Result:
20: invokevirtual #21 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: iload_3
24: invokevirtual #24 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27: invokevirtual #28 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #32 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: return
}
可以看到,在main方法中,首先使用iconst_3和iconst_5指令将3和5分别压入操作数栈中,然后使用iadd指令计算了a和b的和,将结果存储在局部变量c中。接下来使用ldc指令将字符串Result:加载到操作数栈中,之后创建一个StringBuilder对象,调用其append方法将字符串Result:和c的值拼接起来,最后使用println方法将结果打印输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何查看Java字节码? - Python技术站