18

我经常被一个没有源代码的 java 类文件困住,我试图理解我手头的问题。

请注意,反编译器在所有情况下都很有用,但还不够……

我有两个问题

  1. 有哪些工具可以查看java字节码(最好从linux命令行下)
  2. 熟悉java字节码语法有哪些好的参考资料
4

6 回答 6

19

与其直接查看需要熟悉 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 虚拟机指令集具有所有字节码指令的索引。

于 2009-10-12T01:30:41.377 回答
16

要查看类文件的字节码指令,请使用javap -v命令,就像运行 java 程序一样,指定类路径(如果需要)和类名。

例子:

javap -v com.company.package.MainClass

关于字节码指令集, 指令集总结

于 2009-10-12T03:34:32.393 回答
2

Fernflower是一个分析反编译器,因此它将类反编译为可读的 java 代码而不是字节码。当您想了解代码的工作原理时,它会更有用。

于 2009-10-12T05:07:08.807 回答
1

如果你有一个类并且没有源代码,但是你有一个错误,你可以做以下两个基本的事情之一:

  1. 反编译,修复错误并重新创建 jar 文件。我以前做过,但系统管理员对将其投入生产持怀疑态度。
  2. 为类编写单元测试,确定导致错误的原因,使用单元测试报告错误并等待它被修复。

    (2) 根据我的经验,通常是系统管理员更喜欢的一种。

    如果您选择(2),那么与此同时,由于您知道导致错误的原因,您可以不允许该输入进入类,以防止出现问题,或者准备好在错误发生时正确处理它.

    您还可以使用 AspectJ 将代码注入问题类并更改方法的行为,而无需实际重新编译。我认为这可能是更可取的选择,因为您可以为所有可能调用该函数的代码更改它,而不必担心教大家这个问题。

    如果你学会阅读字节码指令,你会怎么解决这个问题?

于 2009-10-12T01:44:23.707 回答
0

我有两个问题

1)有哪些工具可以查看java字节码(最好从linux命令行下)

javap工具(带有 -c 选项)将反汇编一个字节码文件。它从命令行运行,并作为 Java SDK 的一部分提供。

2)熟悉java字节码语法有哪些好的参考资料

javap工具使用与 JVM 规范相同的语法,而 JVM 规范自然是权威来源。我还发现了 Bill Venners 的“Inside the Java Virtual Machine”。我从来没有读过它,它看起来可能已经绝版了。

实际的(文本)语法很简单且不言自明……假设您有一个解释字节码功能的参考资料,并且您对阅读此级别的代码有一定程度的熟悉。但是读取反编译器的输出可能更容易,即使字节码已经通过混淆器提供。

于 2009-10-12T03:27:55.790 回答
0

您可能会发现 Eclipse Byte Code Outline 插件很有用:

http://andrei.gmxhome.de/bytecode/index.html

我自己没有使用它 - 只是顺便提到它。

于 2009-10-12T11:39:08.633 回答