我经常被一个没有源代码的 java 类文件困住,我试图理解我手头的问题。
请注意,反编译器在所有情况下都很有用,但还不够……
我有两个问题
- 有哪些工具可以查看java字节码(最好从linux命令行下)
- 熟悉java字节码语法有哪些好的参考资料
与其直接查看需要熟悉 Java 虚拟机及其操作的 Java 字节码,不如尝试使用 Java 反编译实用程序。反编译器将尝试java
从指定文件创建源class
文件。
我如何“反编译”Java 类文件?是一个相关的问题,它有助于了解如何反编译 Javaclass
文件。
也就是说,可以使用javap
作为 JDK 一部分的命令来反汇编 Javaclass
文件。的输出javap
将是class
文件中包含的 Java 字节码。但请注意,字节码根本不像 Java 源代码。
了解 Java 字节码和 Java 虚拟机本身的确切来源是The Java Virtual Machine Specification, Second Edition。特别是,第 6 章:Java 虚拟机指令集具有所有字节码指令的索引。
要查看类文件的字节码指令,请使用javap -v
命令,就像运行 java 程序一样,指定类路径(如果需要)和类名。
例子:
javap -v com.company.package.MainClass
关于字节码指令集, 指令集总结
Fernflower是一个分析反编译器,因此它将类反编译为可读的 java 代码而不是字节码。当您想了解代码的工作原理时,它会更有用。
如果你有一个类并且没有源代码,但是你有一个错误,你可以做以下两个基本的事情之一:
为类编写单元测试,确定导致错误的原因,使用单元测试报告错误并等待它被修复。
(2) 根据我的经验,通常是系统管理员更喜欢的一种。
如果您选择(2),那么与此同时,由于您知道导致错误的原因,您可以不允许该输入进入类,以防止出现问题,或者准备好在错误发生时正确处理它.
您还可以使用 AspectJ 将代码注入问题类并更改方法的行为,而无需实际重新编译。我认为这可能是更可取的选择,因为您可以为所有可能调用该函数的代码更改它,而不必担心教大家这个问题。
如果你学会阅读字节码指令,你会怎么解决这个问题?
我有两个问题
1)有哪些工具可以查看java字节码(最好从linux命令行下)
该javap
工具(带有 -c 选项)将反汇编一个字节码文件。它从命令行运行,并作为 Java SDK 的一部分提供。
2)熟悉java字节码语法有哪些好的参考资料
该javap
工具使用与 JVM 规范相同的语法,而 JVM 规范自然是权威来源。我还发现了 Bill Venners 的“Inside the Java Virtual Machine”。我从来没有读过它,它看起来可能已经绝版了。
实际的(文本)语法很简单且不言自明……假设您有一个解释字节码功能的参考资料,并且您对阅读此级别的代码有一定程度的熟悉。但是读取反编译器的输出可能更容易,即使字节码已经通过混淆器提供。
您可能会发现 Eclipse Byte Code Outline 插件很有用:
http://andrei.gmxhome.de/bytecode/index.html
我自己没有使用它 - 只是顺便提到它。