2013-10-20 69 views
0

我想更改使用BCEL的方法。但我不知道如何更新Exception表。這裏的簡化代碼:BCEL更新例外表

ConstantPoolGen poolGen = classGen.getConstantPool(); 
InstructionList iList = new InstructionList(method.getCode().getCode()); 
MethodGen newMethodGen = new MethodGen(method, classGen.getClassName(), poolGen); 
for (InstructionHandle handle : iList.getInstructionHandles().clone()) { 
    if (I_WANT_TO_WRAP_IT(handle)) { 
     iList.insert(handle, MAKE_WRAPPER(handle)); 
     iList.delete(handle); 
    } 
} 
classGen.removeMethod(method); 
newMethodGen.setMaxStack(); 
newMethodGen.setMaxLocals(); 
classGen.addMethod(newMethodGen.getMethod()); 

在此之後的字節碼適當修改,但異常表是導致ClassFormatError因爲異常表指向不存在的PC不變。任何想法如何處理這個?

回答

1

通常情況下,您不需要處理這個問題,因爲BCEL應該照顧它。在我看來,你的錯誤是使用與MethodGen不同的指令列表。所以你正在修改底層代碼,但偏移量沒有正確處理。

嘗試使用

MethodGen newMethodGen = new MethodGen(method, classGen.getClassName(), poolGen); 
InstructionList iList = newMethodGen.getInstructionList(); 

,以確保相同的列表用於您的代碼和MethodGen