2013-02-15 65 views

回答

1

考慮到方法的參數類型,你可以做這樣的事情:

int off = (access | Opcodes.ACC_STATIC) == 0 ? 0 : 1; 
int opcode = Type.getArgumentTypes(desc)[param + off].getOpcode(Opcodes.IALOAD); 
mv.visitVarIns(opcode, param); 
... 

其中param是方法的參數數量和accessdesc你是從相應的ClassVisitor.html#visitMethod參數獲取值。

1

方法參數是前幾個局部變量。要訪問第一個參數,字節碼助記符看起來像aload_0iload_0lload_0等,具體取決於參數的類型。對於第四個參數,你會說aload 4等。

請注意,實例方法的第一個參數是對this的引用。所以第一個參數將是本地#1,你會得到它像aload_1

然而,你會生成字節碼與ASM的東西......做到這一點。看起來你會說類似於mv.visitVarInsn(ALOAD, 0);的東西,其中mv是您的MethodVisitor。 0將被替換爲局部變量索引。

+0

嗨,謝謝你的回覆..你可以舉一些使用ASM的例子嗎? – 2013-02-15 11:46:30

+0

不是真的;我從來沒有使用過這些東西,甚至很難理解*爲什麼*它的作品,更不用說*如何*,部分原因在於濫用遊客的猖獗。看起來像*所有*都是某種訪問者。 :P一個真正的字節碼生成庫會更直接;請參閱.net的'System.Reflection.Emit'。 – cHao 2013-02-15 13:18:42