系列中的上一篇
当前教程
Javap - 反汇编器
系列中的下一篇

系列中的上一篇: Javac - 编译器

系列中的下一篇: Javadoc - 文档生成器

Javap - 反汇编器

 

介绍 Javap

javap - 反汇编一个或多个类文件

javap [options] classes...

选项 指定命令行选项。请参阅 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

 

选项

help, --help, or -? 打印 javap 命令的帮助消息。

-version 打印版本信息。

-verbose or -v 打印有关所选类的附加信息。

-l 打印行和局部变量表。

-public 仅显示公共类和成员。

-protected 仅显示受保护和公共类和成员。

-package 显示包/受保护/公共类和成员(默认)。

-private or -p 显示所有类和成员。

-c 打印反汇编代码,例如,构成 Java 字节码的指令,用于类中的每个方法。

-s 打印内部类型签名。

-sysinfo 显示正在处理的类的系统信息(路径、大小、日期、MD5 哈希)。

-constants 显示静态最终常量。

--module module or -m module 指定包含要反汇编的类的模块。

--module-path path 指定在何处查找应用程序模块。

--system jdk 指定在何处查找系统模块。

--class-path path, -classpath path, or -cp path 指定 javap 命令用来查找用户类文件的路径。它会覆盖默认路径或 CLASSPATH 环境变量(如果已设置)。

-bootclasspath path 覆盖引导类文件的路径。

-Joption 将指定的选项传递给 JVM。例如

javap -J-version
javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName

 

更多示例

编译以下 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
}

上次更新: 2021 年 9 月 14 日


系列中的上一篇
当前教程
Javap - 反汇编器
系列中的下一篇

系列中的上一篇: Javac - 编译器

系列中的下一篇: Javadoc - 文档生成器