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
}