The javap Command

名称

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
}