什么是 javap
javap 是 JDK 自带的反汇编器,可以查看 java 编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
百度百科:
javap 是 Java class 文件分解器,可以反编译,也可以查看 java 编译器生成的字节码。用于分解 class 文件。
使用 javap
首先自己实现一个简单的类,如下:
package kaven;public class StartJavaP {
private static Integer number;private static final Integer MAX = 100;public static void main(String[] args){
Integer sum = 0;Integer i =0;while(i < MAX){
sum += i;i++;}System.out.println(sum);}
}
打开 cmd ,cd 到存放这个类的路径上,再用 javac 编译这个类。
C:\Users\Kaven>cd
C:\Users\KavenC:\Users\Kaven>f:F:\>cd F:\Install\CompilerWorkspace\IDEA\MyJavaP\src\kavenF:\Install\CompilerWorkspace\IDEA\MyJavaP\src\kaven>javac StartJavaP.java
编译成功,如下图,多了 StartJavaP.class文件:
再使用 javap -c StartJavaP.class(其他博客说不加 .class 也可以,但是我这里好像不行 )。
F:\Install\CompilerWorkspace\IDEA\MyJavaP\src\kaven>javap -c StartJavaP.class
生成如下字节码:
Compiled from "StartJavaP.java"
public class kaven.StartJavaP {
public kaven.StartJavaP();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_01: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;4: astore_15: iconst_06: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;9: astore_210: aload_211: invokevirtual #3 // Method java/lang/Integer.intValue:()I14: getstatic #4 // Field MAX:Ljava/lang/Integer;17: invokevirtual #3 // Method java/lang/Integer.intValue:()I20: if_icmpge 5623: aload_124: invokevirtual #3 // Method java/lang/Integer.intValue:()I27: aload_228: invokevirtual #3 // Method java/lang/Integer.intValue:()I31: iadd32: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;35: astore_136: aload_237: astore_338: aload_239: invokevirtual #3 // Method java/lang/Integer.intValue:()I42: iconst_143: iadd44: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;47: dup48: astore_249: astore 451: aload_352: pop53: goto 1056: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;59: aload_160: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V63: returnstatic {
};Code:0: bipush 1002: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;5: putstatic #4 // Field MAX:Ljava/lang/Integer;8: return
}
这样就说明反编译成功了。