Java 使用 Javap 命令反编译 class 文件为字节码的对应的文本形式(不是汇编)

参考

备注

还可以通过 jad 命令将字节码文件(class)转换为 java 源代码。

步骤

  1. 要操作的源码
public class Test {
    public static void main(String[] args) {
        getName();
    }

    public static void getName(){
        System.out.println(Thread.currentThread().getName());
    }
}
  1. javac 命令将代码编译为字节码文件,执行完毕后会在当前文件夹下生成 Test.class 文件
javac Test.java
  1. javap 将 Test.class 文件转换为字节码指令(不知道用什么词描述),就会在终端输出字节码指令信息
javap -c Test.class
  1. 输出
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #7                  // Method getName:()V
       3: return

  public static void getName();
    Code:
       0: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: invokestatic  #18                 // Method java/lang/Thread.currentThread:()Ljava/lang/Thread;
       6: invokevirtual #24                 // Method java/lang/Thread.getName:()Ljava/lang/String;
       9: invokevirtual #27                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      12: return
}

javap 命令参数

用法: javap <options> <classes>
其中, 可能的选项包括:
  --help -help -h -?               输出此帮助消息
  -version                         版本信息
  -v  -verbose                     输出附加信息
  -l                               输出行号和本地变量表
  -public                          仅显示公共类和成员
  -protected                       显示受保护的/公共类和成员
  -package                         显示程序包/受保护的/公共类
                                   和成员 (默认)
  -p  -private                     显示所有类和成员
  -c                               对代码进行反汇编
  -s                               输出内部类型签名
  -sysinfo                         显示正在处理的类的
                                   系统信息(路径、大小、日期、SHA-256 散列)
  -constants                       显示最终常量
  --module <模块>, -m <模块>       指定包含要反汇编的类的模块
  -J<vm-option>                    指定 VM 选项
  --module-path <路径>             指定查找应用程序模块的位置
  --system <jdk>                   指定查找系统模块的位置
  --class-path <路径>              指定查找用户类文件的位置
  -classpath <路径>                指定查找用户类文件的位置
  -cp <路径>                       指定查找用户类文件的位置
  -bootclasspath <路径>            覆盖引导类文件的位置
  --multi-release <version>        指定要在多发行版 JAR 文件中使用的版本

GNU 样式的选项可使用 = (而非空白) 来分隔选项名称
及其值。

每个类可由其文件名, URL 或其
全限定类名指定。示例:
   path/to/MyClass.class
   jar:file:///path/to/MyJar.jar!/mypkg/MyClass.class
   java.lang.Object
posted @   夏秋初  阅读(318)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示