简介
Java 类文件反汇编工具(javap)是一个命令行工具,用于反汇编一个或多个 Java 类文件。反汇编的输出内容取决于使用的选项。当不使用任何选项时,javap 命令将打印传递给它的类的包、受保护的和公共字段以及方法。javap 命令将其输出打印到标准输出(stdout)。但是这个命令用的相对不多,反编译我们一般会使用jd-gui这种反编译工具。
1.用法
javap [options] classfile...
-
options: 命令行选项,见下文选项部分。
-
classfile: 一个或多个用空格分隔的待处理的类文件,如 DocFooter.class。我们可以指定类路径中的一个类,通过文件名或者 URL(如 file:///home/user/myproject/src/DocFooter.class)指定。
2.选项
-
-help, --help, -?: 打印 javap 命令的帮助信息。
-
-version: 打印版本信息。
-
-l: 打印行号和局部变量表。
-
-public: 仅显示公共类和成员。
-
-protected: 仅显示受保护和公共类和成员。
-
-private, -p: 显示所有类和成员。
-
-Joption: 将指定的选项传递给 JVM,例如:
javap -J-version
。 -
-s: 打印内部类型签名。
-
-sysinfo: 显示正在处理的类的系统信息(路径、大小、日期、MD5 哈希)。
-
-constants: 显示静态最终常量。
-
-c: 打印反汇编的代码,例如,每个方法中的 Java 字节码指令。
-
-verbose: 打印方法的堆栈大小、局部变量和参数数量。
-
-classpath path: 指定 javap 命令用于查找类的路径。覆盖默认值或 CLASSPATH 环境变量。
-
-bootclasspath path: 指定从哪个路径加载引导类。默认情况下,引导类是实现核心 Java 平台的类,位于 jre/lib/rt.jar 和其他几个 JAR 文件中。
-
-extdir dirs: 覆盖搜索已安装扩展的位置。扩展的默认位置是 java.ext.dirs 的值。
3.示例
编译以下 DocFooter 类:
javaCopy codeimport java.awt.*;
import java.applet.*;public class DocFooter extends Applet {String date;String email;public void init() {resize(500,100);date = getParameter("LAST_UPDATED");email = getParameter("EMAIL");}public void paint(Graphics g) {g.drawString(date + " by ", 100, 15);g.drawString(email, 290, 15);}
}
使用 javap DocFooter.class
命令的输出如下:
yamlCopy codeCompiled from "DocFooter.java"
public class DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;public DocFooter();
Code:
0: aload_0
1: invokespecial #1 // 方法 java/applet/Applet."<init>":()V
4: returnpublic void init();
Code:
0: aload_0
1: sipush 500
4: bipush 100
6: invokevirtual #2 // 方法 resize:(II)V
9: aload_0
10: aload_0
11: ldc #3 // String LAST_UPDATED
13: invokevirtual #4 // 方法 getParameter:(Ljava/lang/String;)Ljava/la