假设我有一个Fraction
class:
class Fraction {
...
/** Invert current fraction */
public Fraction inverse() {
return new Fraction(den,num);
}
...
}
这就是上述方法的字节码:
0 new #1 <xyzTestes/system/fraction/Fraction>
3 dup
4 aload_0
5 getfield #16 <xyzTestes/system/fraction/Fraction.den>
8 aload_0
9 getfield #14 <xyzTestes/system/fraction/Fraction.num>
12 invokespecial #27 <xyzTestes/system/fraction/Fraction.<init>>
15 areturn
我试图理解为什么位置 3 的指令首先被放在那里。我想说我们只需要执行以下操作即可使其正常工作:
new #1 <xyzTestes/system/fraction/Fraction>
aload_0
getfield #16 <xyzTestes/system/fraction/Fraction.den>
aload_0
getfield #14 <xyzTestes/system/fraction/Fraction.num>
invokespecial #27 <xyzTestes/system/fraction/Fraction.<init>>
areturn
为什么不是这样呢?
当构造函数的字节码开始时,没有 Fraction 对象。这new
指令分配一个Fraction
对象(未初始化)从堆中取出,并在堆栈上留下对其的引用。这dup
指令是为了可以使用一个引用来调用<init>
第二个用于areturn
在最后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)