'main'方法中的JVM指令ALOAD_0指向'args'而不是'this'?

时间:2011-01-09 19:59:56

标签: java jvm bytecode instructions jasmin

我正在尝试为学术研究实现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& amp; 2甚至不应该工作。

如何/为何有效?或者是反汇编程序错误并且实际的字节码是其他东西吗?

1 个答案:

答案 0 :(得分:44)

  

aload_0应该将'this'推送到堆栈

不完全...... aload_0读取方法的第一个引用参数(或更一般地说,第一个本地引用变量)并将其推送到堆栈。

在成员函数中,第一个局部变量恰好是this引用。

main不是成员函数,它是静态函数,因此没有this参数,方法的真正第一个参数是{{1} }。