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 , -m | 指定包含要反汇编的类的模块 |
-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
}