編輯:解決方法是,我使用aastore,當我應該使用iastore,因爲我想存儲一個項目整數,而aastore只適用於數組對象。爲什麼不會這個字節碼驗證
我有以下方法我在字節碼生成作爲構造
aload_0
invokespecial java/lang/Object/<init>()V
aload_0
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
aload_0
iconst_0
putfield com/js/interpreter/custom_types/1e9ebd0/l I
aload_0
iconst_0
multianewarray [I 1
astore_1
iconst_0
istore_2
goto 23
18:aload_1
iload_2
iconst_0
aastore
iinc 2 1
23:iload_2
iconst_0
if_icmplt 18
aload_1
putfield com/js/interpreter/custom_types/1e9ebd0/a [I
return
然而,它未能驗證,給予方法:簽名:()V)希望找到對象/堆棧
陣列不過,我可以去通過,並知道在堆棧上項目的精確數目在所有時間:
aload_0
1
invokespecial java/lang/Object/<init>()V
0
aload_0
1
new java/lang/StringBuilder
2
dup
3
invokespecial java/lang/StringBuilder/<init>()V
2
putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
0
aload_0
1
iconst_0
2
putfield com/js/interpreter/custom_types/1e9ebd0/l I
0
aload_0
1
iconst_0
2
multianewarray [I 1
2
astore_1
1
iconst_0
2
istore_2
1
goto 23
18:aload_1
2
iload_2
3
iconst_0
4
aastore
1
iinc 2 1
1
23:iload_2
2
iconst_0
3
if_icmplt 18
1
aload_1
2
putfield com/js/interpreter/custom_types/1e9ebd0/a [I
0
return
當我通過司法驗證運行它,它並沒有給我一個y有用的消息(它甚至無法驗證由javac生成的類)。
這裏可能會發生什麼?有什麼問題?
不是說這是有問題的,但爲什麼你用'multianewarray [I 1'而不是'a newarray'? – MeBigFatGuy 2011-04-29 06:50:09
一般地生成multianewarray指令更容易。我打算在以後優化這些東西。 – 2011-04-29 06:53:51
我想「預計在堆棧上找到對象/數組」,意味着你有堆棧上某處的參數類型錯誤....一個int而不是一個引用?也許你應該擴展你的堆棧元素數量和類型。 – subsub 2011-04-29 07:20:12