2009-10-12 92 views
15

通常我被一个没有源代码的java类文件卡住,我试图理解我手边的问题。理解Java字节代码

注意反编译器是有用的,但在所有的情况下不充分......

我有两个问题

  1. 有什么工具可以查看Java字节码(最好是可以从Linux命令行)
  2. 有什么很好的参考,以熟悉Java字节代码语法

回答

16

,而不是直接在Java字节码看,其中W生病需要熟悉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具有所有字节码指令的索引。

+0

看到我对反编译器的评论, – hhafez 2009-10-12 02:16:28

+0

@hhafez:我想你的问题“了解Java字节代码”被回答,不是吗? – 2009-10-12 03:01:03

1

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

  1. 反编译,修正错误并重新创建jar文件。我之前已经做到了这一点,但系统管理员对于将其投入生产持谨慎态度。
  2. 为该类编写单元测试,确定导致错误的原因,用单元测试报告错误并等待它被修复。 (2)通常是系统管理员以我的经验更喜欢的那个。

    如果你使用(2),那么在此期间,因为你知道是什么原因导致了错误,所以你可以不允许该输入去上课,以防止出现问题,或者准备好妥善处理它当错误发生时。

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

    如果您学习阅读字节码指令,您将如何解决该问题?

+0

1.我不知道你可以使用AspectJ在.class中插入代码,我认为它在java上工作,但我想我错了 2.当我找出问题时,我会做什么?很多时候发现问题的真正目的是解决问题的一半 – hhafez 2009-10-12 02:15:40

+0

@hhafez - 你可以将方面的运行时编织到类中,但是当你这样做时你可能会违反许可证,所以只是有点谨慎。单元测试可能是你最好的选择,但是如果代码不可测试,那么反编译就成为一种选择,但这是一个缓慢的过程,IMO。 – 2009-10-12 03:19:19

0

我有两个问题

1)什么工具可用来查看从Linux命令行Java字节码(优选地可用 )

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

2)什么是很好的参考,以熟悉Java字节代码语法

javap工具使用相同的语法在JVM规范使用,而JVM规范自然是权威来源。 Bill Venners也发现了“Java虚拟机内部”。我从来没有读过它,看起来它可能已经绝版了。

实际的(文本)语法很简单,并且是自我解释的......假设您有一个参考解释了字节码的作用,并且您对这个级别的阅读代码有适度的熟悉度。但是,即使字节码已经通过混淆器输入,读取反编译器的输出也可能更容易。

14

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

实施例:

javap -v com.company.package.MainClass 

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

+1

这个答案完全涵盖了原始问题的两个方面。 – CyberMJ 2013-01-01 23:39:43

2

Fernflower是一种分析反编译,所以它会反编译的类为可读java代码而不是字节码。当你想了解代码的工作方式时,它更加有用。