2013-10-20 6 views
0

BCEL을 사용하여 메소드를 변경하려고합니다. 하지만 예외 테이블을 업데이트하는 방법을 모르겠습니다. 여기에 단순화 된 것 코드 :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()); 

이 바이트 코드가 올바르게 수정하지만 예외 테이블이 PC을 존재하지 않는에 ClassFormatError 때문에 예외 테이블 포인트 리드가 변경되지 후. 이 문제를 어떻게 처리 할 생각입니까?

답변

1

일반적으로 BCEL에서 처리해야하므로이 문제를 처리 할 필요가 없습니다. 귀하의 실수는 MethodGen과 다른 지침 목록을 사용하는 것입니다. 따라서 기본 코드는 수정 중이지만 오프셋은 올바르게 처리되지 않습니다.

같은 목록이 코드 및 MethodGen에 의해 사용되도록

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

를 사용해보십시오.