比方說,我有一個Fraction
類:爲什麼下面的代碼轉換爲java字節碼中的新增重複操作指令?
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
爲什麼不是這樣?
invokespecial將不會引用堆棧中的分數,然後呢? – 2011-12-21 18:41:21
@devoured elysium'()V'返回'void'而不是'Fraction'。 –
2011-12-21 18:45:11
呃,你說得對。 – 2011-12-21 18:45:38