Я возился с ASM рамки для иногда. Я просто хочу поймать исключения.Можно ли сделать исключение на основе подписи метода в ASM?
До сих пор я могу вставить блоки try-catch
в байт-код и поймать исключение.
Это то, что я делаю сейчас.
public void visitMaxs(int maxStack, int maxLocals)
{
// visit try block end label
this.visitLabel(lblTryBlockEnd);
// visit normal execution exit block
//this.visitJumpInsn(Opcodes.GOTO, exitBlock);
// visit catch exception block
this.visitLabel(lblCatchExceptionBlockStart);
// store the exception
this.visitVarInsn(Opcodes.ASTORE, 1);
super.visitTypeInsn(Opcodes.NEW, "java/lang/Exception");
super.visitInsn(Opcodes.DUP);
// load the exception
this.visitVarInsn(Opcodes.ALOAD, 1);
// Initializing the exception object with the throwable cause
super.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Exception", "<init>", "(Ljava/lang/Throwable;)V");
// calling jensor method to write
super.visitMethodInsn(Opcodes.INVOKESTATIC,
"test/ExceptionHandleTest",
"exceptionHandler",
"(Ljava/lang/Exception;)V");
// call printStackTrace()
this.visitInsn(Opcodes.ATHROW);
// exit from this dynamic block
this.visitLabel(exitBlock);
super.visitMaxs(maxStack+2, maxLocals);
}
`
Теперь, я не хочу, чтобы бросить все пойманное исключение (как я делаю athrow
каждый раз сейчас), вместо этого я хочу бросить, только если он совпадает с exception
параметром метода подписи MethodVisitor
.
Я попытался это сделать, но получил Falling off the end of the code
Класс проверки ошибки.
Можно ли использовать ASM?
Заранее спасибо.
Да, ASMifier отлично – omainegra