经常情况下,我所面对的是没有源代码的Java类文件,我需要理解手头遇到的问题。
请注意,反编译器虽然有用,但并不是所有情况下都足够...
我有两个问题
- 有哪些工具可以查看Java字节码(最好能够从Linux命令行使用)?
- 有哪些好的参考资料可以熟悉Java字节码语法?
与其直接查看Java字节码,需要熟悉Java虚拟机及其操作,可以尝试使用Java反编译工具。反编译器将尝试从指定的class文件中创建一个java源文件。
如何“反编译”Java类文件?是一个相关的问题,它可以帮助了解如何反编译Java class文件。
话虽如此,可以使用JDK中的javap命令来反汇编Java类文件。 javap的输出是包含在类文件中的Java字节码。但请注意,字节码与Java源代码完全不同。
学习Java字节码和Java虚拟机本身的明确来源将是Java虚拟机规范第二版。特别是,第6章:Java虚拟机指令集具有所有字节码指令的索引。
要查看Java类文件的字节码指令,请使用javap -v
命令,与运行Java程序的方式相同,指定类路径(如果需要)和类名。
例如:
javap -v com.company.package.MainClass
关于字节码指令集,指令集摘要
如果你有一个类但没有源代码,但是你发现了一个 bug,你可以做以下两件事情:
为该类编写单元测试,确定导致 bug 的原因,使用单元测试报告 bug 并等待修复。
(2) 通常是我经验中系统管理员更喜欢的方法。
如果你选择 (2),那么在此期间,由于你知道 bug 的原因,你可以防止输入进入该类,以避免问题,或者在错误发生时准备妥善处理它。
你还可以使用 AspectJ 将代码注入到问题类中,并更改方法的行为而无需重新编译。我认为这可能是更可取的选项,因为你可以为可能调用该函数的所有代码更改它,而不必担心教会每个人如何解决问题。
如果你学会了阅读字节码指令,你会怎么解决这个问题呢?
http://andrei.gmxhome.de/bytecode/index.html
我自己没有使用过它 - 只是偶然听到别人提起过。