当前位置: 代码迷 >> 综合 >> javap 初使用
  详细解决方案

javap 初使用

热度:91   发布时间:2023-12-01 20:49:37.0

什么是 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
}

这样就说明反编译成功了。