是否可以查看 Class 文件的字节码? [复制]
Posted
技术标签:
【中文标题】是否可以查看 Class 文件的字节码? [复制]【英文标题】:Is it possible to view bytecode of Class file? [duplicate] 【发布时间】:2011-03-19 23:01:32 【问题描述】:可能重复:Is there a java classfile / bytecode editor to edit instructions?
Java 源代码被编译成字节码,实际上是在类文件中。是否可以查看已编译类的字节码?
如果可以,可以编辑吗?
是否有可用的 eclipse 插件?
【问题讨论】:
查看this question 以获得Java 字节码编辑器。 你需要解决的根本问题是什么? 我也对@Thorbjørn 的问题感兴趣。 @Abhishek 您在类文件中寻找什么信息?还是只是出于好奇? 我找到了一个网站,它允许您输入 java 代码并获取字节码作为输出。 nodejs-instantbytecode.rhcloud.com 我需要创建一个分叉的 java 进程,它可以在这个进程中委托给类加载器,而不必覆盖它。如果您实现自己的类加载器,您可以将字节码加载到一个类中。但是,如果您从一个类开始,您就不能将其转换为字节码以传送到外部进程。我的需要是在运行时获取它——而不是出于好奇而查看/修改它。 【参考方案1】:是的。您可以使用 JDK 附带的 javap
命令来查看类的字节码。例如:
javap -c com.mypackage.MyClass
有几个库和工具可以帮助您使用 Java 字节码,例如 ASM 和 Jasmin。
【讨论】:
默认不包括私有方法。使用-p
也包括它们。
对我来说只使用文件名(扩展名似乎是可选的),而不是完全限定的类名:javap -c -p MyClass.class
javap -c com.mypackage.MyClass
将在终端(标准输出)上打印代码。我更喜欢javap -c -p com.mypackage.MyClass >> com.mypackage.MyClass.txt
来查看文件中的代码。【参考方案2】:
JDK 附带javap,这是一个反汇编类文件中字节码的工具。可以在字节码级别进行编辑。看看BCEL,一个用于读取、操作和写入类文件的java库。
可以在java-net 上找到编辑字节码的工具和库列表。例如JBE,一个甚至带有 GUI 的 Java 字节码编辑器。
【讨论】:
【参考方案3】:查看字节码
忘记 javap!我用过的最好的插件是"ASM - Bytecode Outline plugin for Eclipse"
http://asm.ow2.org/eclipse/index.html
它来自 ASM(一种字节码操作框架)。
它显示了字节码(您要求的)、堆栈元素(jvm 样式)以及如何使用 asm 框架方法生成相同的结果(以生成相同的字节码)。
更好的是,当您选择源代码时它会这样做。 您不必在 bin 目录中找到 .class 文件来检查它的字节码。
编辑它们
使用代码:
ASM:基于访问者,非常非常快。 BCEL:将字节码作为类文件的内存描述加载。 Javassit:最简单易用的一种,允许您进行模式匹配和表达式替换。手工:JBE
【讨论】:
+1 我用过 BCEL 和 ASM,ASM 很简洁。它有一个访客可以反编译到已经存在的控制台中。我的意思是,它比 javap 更有能力。 Eclipse 插件摇滚。速度非常快! 在 Mars 2 (4.5.2) 上安装失败 =( 它尝试了一些兼容性修复,但最终没有成功 日食?也可以将 Intellij 用作 ASM 插件【参考方案4】:根据我的经验,jclasslib 是最好的字节码查看器之一。
至于编辑器,有两种类型:字节码操作库和带有 GUI 的编辑器。这个问题在 SO 上被问过几次,您可以查看答案和提供的链接。
请注意,编辑字节码并不像您想象的那么简单。 JVMS 对类文件的格式施加了许多限制,您的编辑很可能会违反其中之一。
检查这些其他问题:
Editing a .class file directly, playing around with opcodes
Is it possible to view bytecode of Class file?
Programming in Java bytecode
【讨论】:
【参考方案5】:尝试使用 -dirtyJOE -Java 整体编辑器是用于编译的 Java 二进制文件(.class 文件)的复杂编辑器和查看器。
【讨论】:
以上是关于是否可以查看 Class 文件的字节码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章