名称
javap - 反汇编一个或多个类文件
简介
javap
[选项] 类...
- 选项
- 指定命令行选项。查看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
。
注意:
在支持--
样式选项的工具中,GNU样式选项可以使用等号(=
)而不是空格来分隔选项的名称和值。
javap选项
-
--help
,-help
,-h
, 或-?
-
打印
javap
命令的帮助消息。 -
-version
- 打印发布信息。
-
-verbose
或-v
- 打印有关所选类的附加信息。
-
-l
- 打印行和局部变量表。
-
-public
- 仅显示公共类和成员。
-
-protected
- 仅显示受保护和公共类和成员。
-
-package
- 显示包/受保护/公共类和成员(默认)。
-
-private
或-p
- 显示所有类和成员。
-
-c
- 打印反汇编代码,例如,类中每个方法所包含的Java字节码指令。
-
-s
- 打印内部类型签名。
-
-sysinfo
- 显示正在处理的类的系统信息(路径、大小、日期、SHA-256哈希)。
-
-constants
-
显示
static final
常量。 -
--module
模块 或-m
模块 - 指定要反汇编的包含类的模块。
-
--module-path
路径 - 指定应用程序模块的位置。
-
--system
jdk - 指定系统模块的位置。
-
--class-path
路径,-classpath
路径, 或-cp
路径 -
指定
javap
命令用于查找用户类文件的路径。当设置时,它会覆盖默认或CLASSPATH
环境变量。 -
-bootclasspath
路径 - 覆盖引导类文件的位置。
-
--multi-release
版本 - 指定在多版本JAR文件中选择的版本。
-
-J
选项 -
将指定的选项传递给JVM。例如:
javap -J-version javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName
查看java中的Java选项概述。
javap示例
编译以下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
}