了解Java字节代码

时间:2009-10-12 01:28:07

标签: java bytecode

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

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

我有两个问题

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

6 个答案:

答案 0 :(得分:18)

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

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

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

了解Java字节码和Java虚拟机本身的确切来源是The Java Virtual Machine Specification, Second Edition。特别是,Chapter 6: The Java Virtual Machine Instruction Set具有所有字节码指令的索引。

答案 1 :(得分:14)

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

示例:

javap -v com.company.package.MainClass

关于字节码指令集, Instruction Set Summary

答案 2 :(得分:2)

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

答案 3 :(得分:1)

如果您有一个类而没有源代码,但是您有一个错误,那么您可以执行以下两个基本操作之一:

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

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

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

    您还可以使用AspectJ将代码注入问题类,并在不实际重新编译的情况下更改方法的行为。我认为这可能是更好的选择,因为你可以为所有可能调用该函数的代码更改它,而不必担心教会每个人这个问题。

    如果您学会阅读字节码说明,您将如何解决问题?

答案 4 :(得分:0)

  

我有两个问题

     

1)有哪些工具可用于查看java字节代码(最好是可用的)   来自linux命令行)

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

  

2)熟悉java字节码语法的好参考

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

实际(文本)语法简单且自我解释...假设您有一个引用来解释字节码的作用,并且您熟悉在此级别读取代码。但是,即使字节码已通过混淆器提供,也可能更容易读取反编译器的输出。

答案 5 :(得分:0)

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

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

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