我经常遇到一个没有源代码的java类文件,我试图理解我手头的问题。
注意反编译器很有用但在所有情况下都不够......
我有两个问题
答案 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)
如果您有一个类而没有源代码,但是您有一个错误,那么您可以执行以下两个基本操作之一:
为类编写单元测试,确定导致错误的原因,通过单元测试报告错误并等待修复。
(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
我自己没有使用它 - 只是看到它顺便提到了。