ITmob-Ly
发布于 2022-08-22 / 278 阅读
0

javap - JDK自带的类文件反汇编器

javap - 类文件反汇编器,用于反汇编一个或多个类文件。这是JDK自带的java命令行工具,它反汇编 class 文件并打印这些类的人类可读版本。

  1. 语法: javap [options] classfile...

classfile 可以是一个或多个由空格分隔的类文件

javap 的输出取决于使用的选项。当不使用任何选项时,将打印包、受保护和公共字段以及传递给它的类的方法。

  1. 选项
help --help -?输出javap的帮助信息
-version版本信息
-v -verbose输出附加信息
-l输出行号和本地变量表
-public仅显示公共类和成员
-protected显示受保护的/公共类和成员
-package显示程序包/受保护的/公共类和成员(默认)
-p -private显示所有类和成员
-c输出反汇编代码
-s输出内部类型签名
-sysinfo显示正在处理的类的系统信息(路径、大小、日期、MD5 哈希)。
-constants显示常量
--module , -m 指定包含要反汇编的类的模块
-J指定一个虚拟机选项
--module-path 指定在哪里可以找到应用程序模块
--system 指定在哪里可以找到系统模块
--class-path 指定查找用户类文件的位置
-classpath 指定查找用户类文件的位置
-cp 指定查找用户类文件的位置
-bootclasspath 覆盖引导类文件的位置
--multi-release 指定要在多版本 JAR 文件中使用的版本
  1. 例子:
// App.java
package com.java.demo;

public class App {
    public String getGreeting() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

编译后执行 javap 命令

C:\Users\xxx\work-space\bin\> javap App.class
Compiled from "App.java"
public class com.java.demo.App {
  public com.java.demo.App();
  public java.lang.String getGreeting();
  public static void main(java.lang.String[]);
}

C:\Users\xxx\work-space\bin\> javap -c App.class
Compiled from "App.java"
public class com.java.demo.App {
  public com.java.demo.App();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public java.lang.String getGreeting();
    Code:
       0: ldc           #16                 // String Hello World!
       2: areturn

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: new           #1                  // class com/java/demo/App
       6: dup
       7: invokespecial #26                 // Method "<init>":()V
      10: invokevirtual #27                 // Method getGreeting:()Ljava/lang/String;
      13: invokevirtual #29                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      16: return
}