我正在尝试实施一部分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

我将获得以下“主要”方法的实现:(拆卸输出在茉莉蛋白中)

.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 应该将“此”推到堆栈上(那就是JVM规范似乎所说的)
2. arraylength 应该返回引用在堆栈上的数组的长度

因此,根据我的说法,1和2的组合甚至不应工作。

它如何/为什么工作?还是拆卸器的错误和实际字节码是其他的?

有帮助吗?

解决方案

Aload_0应该将“此”推到堆栈上

不完全的 … aload_0 阅读 第一个参考参数 (或更一般而言,是该方法的第一个本地参考变量),并将其推到堆栈上。

在成员函数中,第一个本地变量恰好是 this 参考。

main 不是会员函数,而是 静止的 功能,所以没有 this 参数,该方法的真正第一个参数是 args.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top