javap - 类文件反汇编器,用于反汇编一个或多个类文件。这是JDK自带的java命令行工具,它反汇编 class 文件并打印这些类的人类可读版本。
- 语法: javap [options] classfile...
classfile 可以是一个或多个由空格分隔的类文件
javap 的输出取决于使用的选项。当不使用任何选项时,将打印包、受保护和公共字段以及传递给它的类的方法。
- 选项
| help --help -? | 输出javap的帮助信息 | 
|---|---|
| -version | 版本信息 | 
| -v -verbose | 输出附加信息 | 
| -l | 输出行号和本地变量表 | 
| -public | 仅显示公共类和成员 | 
| -protected | 显示受保护的/公共类和成员 | 
| -package | 显示程序包/受保护的/公共类和成员(默认) | 
| -p -private | 显示所有类和成员 | 
| -c | 输出反汇编代码 | 
| -s | 输出内部类型签名 | 
| -sysinfo | 显示正在处理的类的系统信息(路径、大小、日期、MD5 哈希)。 | 
| -constants | 显示常量 | 
| --module | 指定包含要反汇编的类的模块 | 
| -J | 指定一个虚拟机选项 | 
| --module-path | 指定在哪里可以找到应用程序模块 | 
| --system | 指定在哪里可以找到系统模块 | 
| --class-path | 指定查找用户类文件的位置 | 
| -classpath | 指定查找用户类文件的位置 | 
| -cp | 指定查找用户类文件的位置 | 
| -bootclasspath | 覆盖引导类文件的位置 | 
| --multi-release | 指定要在多版本 JAR 文件中使用的版本 | 
- 例子:
// App.java
package com.java.demo;
public class App {
    public String getGreeting() {
        return "Hello World!";
    }
    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}
编译后执行 javap 命令
C:\Users\xxx\work-space\bin\> javap App.class
Compiled from "App.java"
public class com.java.demo.App {
  public com.java.demo.App();
  public java.lang.String getGreeting();
  public static void main(java.lang.String[]);
}
C:\Users\xxx\work-space\bin\> javap -c App.class
Compiled from "App.java"
public class com.java.demo.App {
  public com.java.demo.App();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return
  public java.lang.String getGreeting();
    Code:
       0: ldc           #16                 // String Hello World!
       2: areturn
  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: new           #1                  // class com/java/demo/App
       6: dup
       7: invokespecial #26                 // Method "<init>":()V
      10: invokevirtual #27                 // Method getGreeting:()Ljava/lang/String;
      13: invokevirtual #29                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      16: return
}