Javap - 反汇编器
介绍 Javap
javap - 反汇编一个或多个类文件
javap [options] classes...
选项 指定命令行选项。请参阅 Javap 的选项。
类 指定一个或多个用空格分隔的类,以供处理注释。您可以指定一个可以在类路径中找到的类,方法是使用其文件名、URL 或完全限定的类名。
示例
path/to/MyClass.class
jar:file:///path/to/MyJar.jar!/mypkg/MyClass.class
java.lang.Object
描述
javap
命令反汇编一个或多个类文件。输出取决于使用的选项。当不使用任何选项时,javap
命令会打印传递给它的类的受保护和公共字段以及方法。
javap
命令不支持多版本 JAR。使用命令的类路径形式会导致查看所有 JAR 文件中的基本条目,无论是否为多版本。使用 URL 形式,您可以使用参数的 URL 形式来指定要反汇编的类的特定版本。
javap
命令将输出打印到 stdout
。
选项
help, --help, or -?
打印 javap 命令的帮助消息。
-version
打印版本信息。
-verbose or -v
打印有关所选类的附加信息。
-l
打印行和局部变量表。
-public
仅显示公共类和成员。
-protected
仅显示受保护和公共类和成员。
-package
显示包/受保护/公共类和成员(默认)。
-private
or -p
显示所有类和成员。
-c
打印反汇编代码,例如,构成 Java 字节码的指令,用于类中的每个方法。
-s
打印内部类型签名。
-sysinfo
显示正在处理的类的系统信息(路径、大小、日期、MD5 哈希)。
-constants
显示静态最终常量。
--module module
or -m module
指定包含要反汇编的类的模块。
--module-path path
指定在何处查找应用程序模块。
--system jdk
指定在何处查找系统模块。
--class-path path
, -classpath
path, or -cp path
指定 javap 命令用来查找用户类文件的路径。它会覆盖默认路径或 CLASSPATH 环境变量(如果已设置)。
-bootclasspath path
覆盖引导类文件的路径。
-Joption
将指定的选项传递给 JVM。例如
javap -J-version
javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName
更多示例
编译以下 HelloWorldFrame 类
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class HelloWorldFrame extends JFrame {
String message = "Hello World!";
public HelloWorldFrame(){
setContentPane(new JPanel(){
@Override
protected void paintComponent(Graphics g) {
g.drawString(message ,15, 30);
}
});
setSize(100,100);
}
public static void main(String[] args) {
HelloWorldFrame frame = new HelloWorldFrame();
frame.setVisible(true);
}
}
javap HelloWorldFrame.class
命令的输出如下
Compiled from "HelloWorldFrame.java"
public class HelloWorldFrame extends javax.swing.JFrame {
java.lang.String message;
public HelloWorldFrame();
public static void main(java.lang.String[]);
}
javap -c HelloWorldFrame.class
命令的输出如下
Compiled from "HelloWorldFrame.java"
public class HelloWorldFrame extends javax.swing.JFrame {
java.lang.String message;
public HelloWorldFrame();
Code:
0: aload_0
1: invokespecial #1 // Method javax/swing/JFrame."<init>":()V
4: aload_0
5: ldc #2 // String Hello World!
7: putfield #3 // Field message:Ljava/lang/String;
10: aload_0
11: new #4 // class HelloWorldFrame$1
14: dup
15: aload_0
16: invokespecial #5 // Method HelloWorldFrame$1."<init>":(LHelloWorldFrame;)V
19: invokevirtual #6 // Method setContentPane:(Ljava/awt/Container;)V
22: aload_0
23: bipush 100
25: bipush 100
27: invokevirtual #7 // Method setSize:(II)V
30: return
public static void main(java.lang.String[]);
Code:
0: new #8 // class HelloWorldFrame
3: dup
4: invokespecial #9 // Method "<init>":()V
7: astore_1
8: aload_1
9: iconst_1
10: invokevirtual #10 // Method setVisible:(Z)V
13: return
}
上次更新: 2021 年 9 月 14 日