了解Java字节代码

我经常遇到没有源代码的java类文件,我试图理解我手边的问题。

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

我有两个问题

  1. 有哪些工具可用于查看java字节代码(最好从linux命令行获得)
  2. 熟悉java字节码语法有什么好的参考

可以尝试使用Java反编译实用程序,而不是直接查看需要熟悉Java虚拟机及其操作的Java字节码。 反编译器将尝试从指定的class文件创建java源文件。

我如何“反编译”Java类文件? 是一个相关的问题,可以提供有关如何反编译Java class文件的信息。

也就是说,可以使用javap命令,它是JDK的一部分,以便反汇编Java class文件。 javap的输出将是class文件中包含的Java字节码。 但请注意,字节码根本不像Java源代码。

学习Java字节码和Java虚拟机本身的确切来源是Java虚拟机规范,第二版 。 特别是, 第6章:Java虚拟机指令集具有所有字节码指令的索引。

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

例:

 javap -v com.company.package.MainClass 

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

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

如果你有一个类而没有源代码,但是你有一个bug,你可以做以下两件事之一:

  1. 反编译,修复错误并重新创建jar文件。 我之前已经这样做了,但是系统管理员对于将其投入生产持谨慎态度。
  2. 编写类的unit testing,确定导致错误的原因,通过unit testing报告错误并等待修复。

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

    如果你跟(2)一起,那么,在此期间,既然你知道是什么导致了这个bug,你可以不允许该输入进入类,以防止出现问题,或者准备好在错误发生时正确处理它。

    您还可以使用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

我自己没有用过它 – 只是看到它顺便提到了。