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