BCEL更新例外表

时间:2013-10-20 10:49:19

标签: java bytecode bcel

我想使用BCEL更改方法。但我不知道如何更新Exception表。这是简化的代码:

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 个答案:

答案 0 :(得分:1)

通常你不需要处理这个问题,因为BCEL应该照顾它。在我看来,你的错误是使用与MethodGen不同的指令列表。因此,您正在修改基础代码,但未正确处理偏移。

尝试使用

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

确保代码和MethodGen使用相同的列表。