当前位置: 首页 > java >正文

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
  • 然后执行执行命令: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中查看对饮的汇编代码。
在这里插入图片描述

http://www.xdnf.cn/news/11995.html

相关文章:

  • 【原理解析】为什么显示器Fliker dB值越大,闪烁程度越轻?
  • React---扩展补充
  • 祝贺XC3576H通过银河麒麟桌面操作系统的兼容性测试,取得麒麟软件互认证证书
  • 结节性甲状腺肿全流程大模型预测与决策系统总体架构设计方案大纲
  • Spring BeanPostProcessor
  • 【计算机组成原理】SPOOLing技术
  • PowerBI企业运营分析—全动态盈亏平衡分析
  • AI IDE 正式上线!通义灵码开箱即用
  • 驱动:字符设备驱动注册、读写实操
  • 用OpenNI2获取奥比中光Astra Pro输出的深度图(win,linux arm64平台)
  • React从基础入门到高级实战:React 高级主题 - 测试进阶:从单元测试到端到端测试的全面指南
  • PWM 相关知识整理
  • 【大模型:知识图谱】--4.neo4j数据库管理(cypher语法1)
  • 振动力学:欧拉-伯努利梁的弯曲振动(考虑轴向力作用)
  • Qt Quick快速入门笔记
  • 国产三维CAD皇冠CAD在「金属压力容器制造」建模教程:蒸汽锅炉
  • 音乐播放器小程序设计与实现 – 小程序源码分享
  • typescript中的type如何使用
  • gitlab rss订阅失败
  • LeetCode 3226.使两个整数相等的位更改次数
  • SkyWalking架构深度解析:分布式系统监控的利器
  • Docker容器化的文件系统隔离机制解析
  • 解决com.jcraft.jsch.JSchException: Algorithm negotiation fail
  • CppCon 2015 学习:Beyond Sanitizers
  • 全角转半角函数(APP)
  • Viggle:开启视频人物替换新纪元
  • 书籍转圈打印矩阵(8)0604
  • Reids 如何处理缓存穿透、缓存击穿、缓存雪崩问题?
  • 使用ArcPy进行栅格数据分析
  • 麒麟+ARM架构安装mysql8的操作指南