能否查看Java类文件的字节码?

18

我正在Java中进行字节码操作和生成。我想知道是否有一种简单的方法可以检查字节码。 我不想反编译文件,我想实际查看编译后的字节码。 我不需要编辑它。 任何可以完成此任务的链接或程序都是可接受的答案。


通常情况下,您可以直接在集成开发环境中完成。也许需要一些插件帮助。 - maba
2
我认为你要找的是 javap。这是随 JDK 一起提供的命令。 - Marko Topolnik
try javap -c classfile - Satya
不,那并不显示所有的字节码,只显示字段和方法。 - Popgalop
@Popgalop javap -v 显示字节码 - 请参见我下面的答案。 - Oak
4个回答

48

如果你想要一个能够轻松显示字节码的程序,我的建议是使用IntelliJ IDEA,因为它内置了查看字节码的支持。

以下是如何操作的示例(也可以映射到您选择的某些键):

输入图像描述

输入图像描述

这非常简单,当然也可以在eclipse或NetBeans中完成。


行号在哪里?L0,L1是什么意思??? - voipp
这个在 Android Studio 中也可用吗?至少对于编译为 JVM 的类(例如本地单元测试等)。 - Igor Čordaš
@PSIXO 我不知道,我只是使用原版的IntelliJ。 - maba
1
请注意,这需要安装_ByteCode Viewer_插件。 - Ciprian Tomoiagă
1
@voipp LINENUMBER 10 L2 表示代码行号为10的代码位于标签 L2。因此,L0L1等都是标签,即程序中的跳转点。在字节码中,没有函数或循环,只有跳转(可以是条件性的)。因此,整个程序就是一堆 IF this GO there_1; IF that GO there_2 - Ciprian Tomoiagă
javap -c 输出的内容完全不同,非常简单。有没有办法也查看那个呢? - Nearoo

6

我不确定您需要什么,但是除了用于显示字节码的命令行工具javap外,您还可以查看javassistasmcglib-它们允许您使用Java代码解析字节码。


2
javap 是 Oracle JDK 自带的命令行工具,可以详细显示 .class 文件内容,包括常量池和所有函数的字节码内容。只需使用 -v 参数运行即可获得完整的输出结果。

但我想看编译器读取文件时的内容,以便我可以创建自己的合成类。 - Popgalop
@Popgalop,编译器读取的是实际的字节码,而不是文本格式。我猜你可以在十六进制编辑器中打开它,并使用此引用自行解析(http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html),但如果您想要一个人类可读的转储,则 javap -v 是答案。 - Oak

2
我一直在开发一个反编译器,它有一种彩色字节码输出模式(我觉得比javap更易读)。它还可以输出Java代码或中间的“字节码AST”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接