理解Java字节代码
通常我被一个没有源代码的java类文件卡住,我试图理解我手边的问题。理解Java字节代码
注意反编译器是有用的,但在所有的情况下不充分......
我有两个问题
- 有什么工具可以查看Java字节码(最好是可以从Linux命令行)
- 有什么很好的参考,以熟悉Java字节代码语法
,而不是直接在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具有所有字节码指令的索引。
如果你有一个类,并没有源代码,但你有一个错误,你可以做两件基本的事情之一:
- 反编译,修正错误并重新创建jar文件。我之前已经做到了这一点,但系统管理员对于将其投入生产持谨慎态度。
-
为该类编写单元测试,确定导致错误的原因,用单元测试报告错误并等待它被修复。 (2)通常是系统管理员以我的经验更喜欢的那个。
如果你使用(2),那么在此期间,因为你知道是什么原因导致了错误,所以你可以不允许该输入去上课,以防止出现问题,或者准备好妥善处理它当错误发生时。
您还可以使用AspectJ将代码注入到问题类中,并在不实际重新编译的情况下更改方法的行为。我认为这可能是更好的选择,因为您可以更改所有可能调用该函数的代码,而无需担心向每个人讲解该问题。
如果您学习阅读字节码指令,您将如何解决该问题?
1.我不知道你可以使用AspectJ在.class中插入代码,我认为它在java上工作,但我想我错了 2.当我找出问题时,我会做什么?很多时候发现问题的真正目的是解决问题的一半 – hhafez 2009-10-12 02:15:40
@hhafez - 你可以将方面的运行时编织到类中,但是当你这样做时你可能会违反许可证,所以只是有点谨慎。单元测试可能是你最好的选择,但是如果代码不可测试,那么反编译就成为一种选择,但这是一个缓慢的过程,IMO。 – 2009-10-12 03:19:19
我有两个问题
1)什么工具可用来查看从Linux命令行Java字节码(优选地可用 )
的javap
工具(与-c选项)将反汇编一个字节码文件。它从命令行运行,并作为Java SDK的一部分提供。
2)什么是很好的参考,以熟悉Java字节代码语法
的javap
工具使用相同的语法在JVM规范使用,而JVM规范自然是权威来源。 Bill Venners也发现了“Java虚拟机内部”。我从来没有读过它,看起来它可能已经绝版了。
实际的(文本)语法很简单,并且是自我解释的......假设您有一个参考解释了字节码的作用,并且您对这个级别的阅读代码有适度的熟悉度。但是,即使字节码已经通过混淆器输入,读取反编译器的输出也可能更容易。
要查看类文件的字节码指令,请使用javap -v
命令,就像运行java程序一样,指定classpath(如果需要)和类名称。
实施例:
javap -v com.company.package.MainClass
关于所述字节代码指令集, Instruction Set Summary
这个答案完全涵盖了原始问题的两个方面。 – CyberMJ 2013-01-01 23:39:43
看到我对反编译器的评论, – hhafez 2009-10-12 02:16:28
@hhafez:我想你的问题“了解Java字节代码”被回答,不是吗? – 2009-10-12 03:01:03