📅  最后修改于: 2023-12-03 15:01:59.521000             🧑  作者: Mango
javap
是 Java Development Kit(JDK)中附带的类文件反汇编工具。使用 javap
工具可以查看 Java 类的成员变量、方法以及字节码信息等。
在命令行中输入 javap
命令即可查看指定 Java 类的信息。例如:
javap java.lang.String
该命令会输出 java.lang.String
类的信息,包括类中的成员变量和方法以及对应的字节码信息。
在输出信息中,每个方法和成员变量都有对应的修饰符,例如 public
或者 private
,用于控制访问权限。
javap
命令的一般语法如下:
javap [options] [classes]
其中,options
表示选项,在 javap
命令中可以使用一些不同的选项参数。classes
表示待查看的类,可以是类名或者类文件路径。
以下是一些常用的 javap
命令选项:
-help
:查看 javap
命令的帮助信息;-c
:反汇编时同时输出 Java 字节码;-classpath path
:指定搜索类文件的路径;-private
:显示所有成员信息,包括私有成员。假设我们有如下的 HelloWorld.java
文件:
public class HelloWorld {
private String message;
public HelloWorld(String message) {
this.message = message;
}
public void setMessage(String message) {
this.message = message;
}
public void printMessage() {
System.out.println(message);
}
public static void main(String[] args) {
HelloWorld helloworld = new HelloWorld("Hello, world!");
helloworld.printMessage();
}
}
我们可以使用 javap
命令查看该类的信息:
$ javap HelloWorld
Compiled from "HelloWorld.java"
public class HelloWorld {
private java.lang.String message;
public HelloWorld(java.lang.String);
public void setMessage(java.lang.String);
public void printMessage();
public static void main(java.lang.String[]);
}
从输出信息中可以看到,HelloWorld
类包含了一个私有的 message
成员变量以及三个公共方法。我们还可以使用 -c
选项查看该类的反汇编代码:
$ javap -c HelloWorld
Compiled from "HelloWorld.java"
public class HelloWorld {
private java.lang.String message;
public HelloWorld(java.lang.String);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field message:Ljava/lang/String;
9: return
public void setMessage(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #2 // Field message:Ljava/lang/String;
5: return
public void printMessage();
Code:
0: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: getfield #2 // Field message:Ljava/lang/String;
7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
public static void main(java.lang.String[]);
Code:
0: new #5 // class HelloWorld
3: dup
4: ldc #6 // String Hello, world!
6: invokespecial #7 // Method "<init>":(Ljava/lang/String;)V
9: astore_1
10: aload_1
11: invokevirtual #8 // Method printMessage:()V
14: return
}
从反汇编代码中可以看到,每个方法都有对应的字节码指令,例如 aload_0
和 invokespecial
等,可供进一步学习字节码的开发人员进行参考。