那么,我们如何反编译指定的Java字节码文件呢?其实,在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下)。
我们可以在dos窗口中使用javap来反汇编指定的Java字节码文件。在使用javap的相关dos命令之前,你必须确保已经将JDK安装目录\bin
添加到环境变量path中。
接着,我们就可以使用javap来反编译指定的Java字节码文件了。在此之前,我们先通过javap的帮助命令javap -help
查看javap相关指令的用法。
从上述内容我们可以知道,javap的使用命令格式为javap 选项参数 类名
,其中选项参数
可以有多个,中间用空格隔开,也可以一个都没有。下面我们编写如下源代码文件(包名test
,类名Person
),并将其编译为Person.class
字节码文件。
- package test;public class Person {
- public Person(String name, int age, boolean gender, String address) {
- this.name = name;
- this.age = age;
- this.gender = gender;
- this.address = address;
- }
- private String name; // private修饰符
- int age; // 默认无访问修饰符(即下面所说的package、friendly)
- protected boolean gender; // protected修饰符
- public String address; // public修饰符
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void sayHi() {
- System.out.println("Hello, my name is " + this.name);
- }
- }
接着将包名文件夹test及Person.class放置在D:\java
目录下。以便于我们使用javap命令进行测试。
在执行命令之前,我们需要将dos窗口的当前工作目录变更为D:\java\test
。
1、使用不带任何选项参数的命令:javap Person
javap Person
和javap -package Person
的显示结果一样,因为-package
选项参数是默认的,用于显示package
(不带任何访问修饰符,即我们常说的friendly)、protected
、public
修饰的类或成员。
备注:在dos下进入工作目录D:\java
,然后使用命令javap test.Person
也可以实现上述操作。下同。
2、使用命令:javap -public Person显示public修饰的类或成员。
与此类似,选项参数-protected
用于显示protected
以上访问级别(protected
、public
)的类或成员;选项参数-private
用于显示private
以上访问级别,也就是所有的类或成员。
3、使用命令:javap -public -l Person显示public修饰的类或成员,并显示行号表格和本地变量表格。
4、使用命令:javap -c Person显示Person.class反汇编出的字节码命令。
由于选项参数之间组合较多,因此其他选项参数不再一一截图赘述,仅在下面使用文字进行说明:
-
-classpath <pathlist>
- 手动指定用户class字节码文件的存放目录,javap程序将在此目录下查找class文件,多个路径以英文分号分隔。例如:javap -classpath D:\java\test Person(即使DOS窗口的当前工作目录为其他任意路径,该命令均可正确执行)。 -s
- 打印变量的内部类型签名,例如:javap -classpath D:\java\test -s Person。 -extdirs <dirs>
- 指定 javap搜索已 安装的java扩展的位置,默认的java扩展的位置为jre\lib\ext。例如:javap -classpath D:\java\test -extdirs D:\java\myext Person -bootclasspath <pathlist>
- 指定使用Java底层类加载器(bootstrap class loader)加载的字节码文件的位置。例如:javap -classpath D:\java\test -bootclasspath D:\java\core Person -verbose
- 打印方法参数和本地变量的数量以及栈区大小。 -J<flag>
- 使用javap.exe来执行java.exe虚拟机的相关命令,例如javap -J-version相当于 java -version,可以有多个命令,中间以空格隔开。