Java编程基础与JVM字节码分析
1. 引言
Java有一些知名的反编译器,对JVM字节码进行反编译比底层的x86代码要容易,原因如下:
- 数据类型的信息更丰富。
- JVM内存模型更加严谨和清晰。
- Java编译器不做任何优化(JVM的即时编译器JIT在运行时进行优化),因此类文件中的字节码通常可读性较高。
了解JVM知识在以下场景中会很有用:
- 对类文件进行快速简单的修补,无需重新编译反编译器的结果。
- 分析混淆代码。
- 分析较新Java编译器生成的代码,而此时可能还没有更新的反编译器。
- 构建自己的混淆器。
- 构建针对JVM的编译器代码生成器(如Scala、Clojure等)。
在后续示例中,除非特别说明,均使用JDK 1.7。反编译类文件的通用命令是: javap -c -verbose
。
2. 返回值
在Java中,通常所说的“函数”实际上是“方法”,因为每个方法都与某个类相关联,不能在类外部定义方法。为了简便,下面仍将其称为“函数”。
2.1 返回整数0
public class ret
{
public static int main(String[] args)
{
return 0;
}
}
编译命令: javac ret.java
反编译命令: javap -c