我可以根据ASM中的方法签名抛出异常吗?

时间:2013-10-03 16:33:16

标签: java java-bytecode-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参数匹配时才想抛出{1}}。

我试图这样做,但得到Falling off the end of the code类验证错误。

是否可以使用ASM?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你可以这样做,我建议你在Java和ASMifier中写下你想要的字节代码,看看它是如何构建的。

IDE有一个ASM插件,可以让这更容易。

答案 1 :(得分:0)

您的代码片段提供的信息太少,无法确切地说明您的实际操作。你说你想要(重新)在特定条件下抛出异常,但你没有说出你想做什么。这完全匹配验证程序错误:如果在某些条件下跳过throw指令并且没有提供方法的替代结束,则代码将脱离方法的末尾。您必须为该案例提供代码,例如受控制的回报。另一种方法是不捕获不符合您标准的异常,但最终会导致与重新抛出所有异常相同的行为。