我正在尝试为学术研究实现 Java 的一个子集。好吧,我正处于最后阶段(代码生成),我编写了一个相当简单的程序来查看如何处理方法参数:
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
然后我构建它,并通过我在以下位置找到的在线反汇编程序运行“Main.class”: http ://www.cs.cornell.edu/People/egs/kimera/disassembler.html
我得到了“main”方法的以下实现:(反汇编的输出在 Jasmin 中)
.method public static main([Ljava/lang/String;)V
.limit locals 1
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
aload_0
arraylength
invokevirtual java/io/PrintStream.println(I)V
return
.end method
我的问题是:
1.aload_0
应该将'this'推到堆栈上(这就是JVM规范似乎所说的)
2.arraylength
应该返回其引用位于堆栈顶部的数组的长度
所以根据我的说法,1 和 2 的组合甚至不应该工作。
它如何/为什么起作用?还是反汇编程序有问题,实际的字节码是别的?