假设我有一Fraction节课:
class Fraction {
...
/** Invert current fraction */
public Fraction inverse() {
return new Fraction(den,num);
}
...
}
Run Code Online (Sandbox Code Playgroud)
这就是上述方法的字节码结果如下:
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
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么第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
Run Code Online (Sandbox Code Playgroud)
为什么不是这样?
Ted*_*opp 10
当构造函数的字节码开始时,没有Fraction对象.该new指令Fraction从堆中分配一个对象(未初始化),并在堆栈上留下对它的引用.该dup指令使得一个引用可用于调用<init>,而第二个引用用于areturn最后.
你的字节码不正确.让我们一步一步:
new #1 <xyzTestes/system/fraction/Fraction>
Run Code Online (Sandbox Code Playgroud)
堆栈:Fraction实例(未初始化,仅指向内存的指针)
aload_0
Run Code Online (Sandbox Code Playgroud)
堆栈 :( Fraction仍然未初始化),this
getfield #16 <xyzTestes/system/fraction/Fraction.den>
Run Code Online (Sandbox Code Playgroud)
堆栈 :( Fraction仍然未初始化),this.den
aload_0
getfield #14 <xyzTestes/system/fraction/Fraction.num>
Run Code Online (Sandbox Code Playgroud)
堆栈 :( Fraction仍未初始化)this.den,this.num
invokespecial #27 <xyzTestes/system/fraction/Fraction.<init>>
Run Code Online (Sandbox Code Playgroud)
堆栈:
这很关键.所有invoke方法都要求堆栈包含this+所有参数.两者this和参数都来自堆栈.在调用之后,只有一个返回值(如果有的话)放在堆栈上.<init>有一个void返回类型.
这意味着您将致电:
areturn
Run Code Online (Sandbox Code Playgroud)
在空堆栈上,吹灭JVM.
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |