如何用ASM实现"throws InterrruptedException"?

How to implement "throws InterrruptedException" with ASM?

我正在使用 Java ASM 字节代码库为以下方法主体生成字节代码:

public void SearchOrSort(MyList<Integer> list) throws InterruptedException {

    synchronized (this) {
        this.wait();
    }
    Thread.sleep(2000);
    
}

使用ASM打印上面所示方法的字节码,我得到了附图上的输出。 (左栏)

右栏是我根据打印的字节码创建的源代码。

我正在努力实施标签 3、5 和 4。

“Frame full”和“chop”是 StackMapTable 属性的一部分。在大多数情况下,您不必担心这些 - ASM 可以为您自动生成它们。

至于 goto 的标签,这就是您用于要跳转到的代码的任何标签。在这方面,它与任何其他控制流程相同。顺便说一句,您需要将 ASM 标签存储在变量中,以便您可以在以后的控制流指令中引用它们。

在这种情况下唯一的复杂情况是异常处理程序是自动生成的,而不是您编写的代码的一部分。在 Java synchronized 中,块是用一个围绕整个事物的秘密异常处理程序编译的。