我想使用 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
。知道如何处理这个问题吗?
通常你不需要处理这个问题,因为BCEL应该处理它。在我看来,您的错误是使用与MethodGen
不同的指令列表.因此,您正在修改基础代码,但偏移量未正确处理。
尝试使用
MethodGen newMethodGen = new MethodGen(method, classGen.getClassName(), poolGen);
InstructionList iList = newMethodGen.getInstructionList();
以确保您的代码和MethodGen
使用相同的列表。