Java 反汇编
前言
在Java中进行学习或者排查问题时,可能经常需要进行反汇编Java字节码文件,查看相关的汇编信息,接下来就介绍几种常用的反汇编方式。
Java反汇编是指把Java编译生成的.class
文件转换为一种更易于阅读的方式,方便查看其中的局部变量表、异常信息表、汇编指令等。可以更方便理解Java的一些优化手段,认识到许多问题的本质原因。
Javap
javap
是JDK自带的反汇编工具,直接使用javap --help
查看简单使用指南:
javap --help
用法: javap <options> <classes>
其中, 可能的选项包括:-help --help -? 输出此用法消息-version 版本信息-v -verbose 输出附加信息-l 输出行号和本地变量表-public 仅显示公共类和成员-protected 显示受保护的/公共类和成员-package 显示程序包/受保护的/公共类和成员 (默认)-p -private 显示所有类和成员-c 对代码进行反汇编-s 输出内部类型签名-sysinfo 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)-constants 显示最终常量-classpath <path> 指定查找用户类文件的位置-cp <path> 指定查找用户类文件的位置-bootclasspath <path> 覆盖引导类文件的位置
Javap 使用
示例代码,TestJavap.java
public class TestJavap {public static void main(String[] args) {int a = 1 + 2;System.out.println(a);}
}
- 首先编译改文件;
- 如果使用IDEA,直接编译或者执行一次就可以(普通Java项目输出位于
out/
目录下,Maven项目输出位于target/
目录下); - 或者执行命令
javac TestJavap.java
;
- 如果使用IDEA,直接编译或者执行一次就可以(普通Java项目输出位于
- 然后执行执行命令:
javap -v TestJava.class
Classfile /D:/work/Java/Hello/src/TestJavap.classLast modified 2025-6-4; size 394 bytesMD5 checksum c5f710e0d1fc03c06cfa40f6518a23c0Compiled from "TestJavap.java"
public class TestJavapminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref #5.#14 // java/lang/Object."<init>":()V#2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream;#3 = Methodref #17.#18 // java/io/PrintStream.println:(I)V#4 = Class #19 // TestJavap#5 = Class #20 // java/lang/Object#6 = Utf8 <init>#7 = Utf8 ()V#8 = Utf8 Code#9 = Utf8 LineNumberTable#10 = Utf8 main#11 = Utf8 ([Ljava/lang/String;)V#12 = Utf8 SourceFile#13 = Utf8 TestJavap.java#14 = NameAndType #6:#7 // "<init>":()V#15 = Class #21 // java/lang/System#16 = NameAndType #22:#23 // out:Ljava/io/PrintStream;#17 = Class #24 // java/io/PrintStream#18 = NameAndType #25:#26 // println:(I)V#19 = Utf8 TestJavap#20 = Utf8 java/lang/Object#21 = Utf8 java/lang/System#22 = Utf8 out#23 = Utf8 Ljava/io/PrintStream;#24 = Utf8 java/io/PrintStream#25 = Utf8 println#26 = Utf8 (I)V
{public TestJavap();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=10: iconst_31: istore_12: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;5: iload_16: invokevirtual #3 // Method java/io/PrintStream.println:(I)V9: returnLineNumberTable:line 4: 0line 5: 2line 6: 9
}
SourceFile: "TestJavap.java"
IDEA 插件 jclasslib(推荐)
第二种方式则是基于IDEA的插件jclasslib
。
安装好后,在导航栏的view
视图中可以打开。如果要查看对应文件的字节码,还是需要先编译或者执行一次。
然后就可以在IDEA中查看对饮的汇编代码。