我经常被一个没有源代码的 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
我自己没有使用它 - 只是顺便提到它。