📜  Java中的javap工具与示例(1)

📅  最后修改于: 2023-12-03 15:01:59.521000             🧑  作者: Mango

Java中的javap工具与示例

介绍

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_0invokespecial等,可供进一步学习字节码的开发人员进行参考。