“主要”方法中的JVM指令aload_0指向“ args”而不是“ this”?
-
09-10-2019 - |
题
我正在尝试实施一部分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
.
不隶属于 StackOverflow