gpt4 book ai didi

java - 通过分析字节码,我如何检测 catch block 中的显式 throw 语句调用?

转载 作者:行者123 更新时间:2023-11-29 05:38:57 24 4
gpt4 key购买 nike

我想检测从 catch block 中发生的 throw 语句。例如:

try 
{
def();
}
catch (IOException e)
{
throw e;
}
catch (Exception e)
{
throw new RuntimeException(e);
}

首先,我使用 Eclipse-JDT 来检测这些情况,这非常简单,因为我可以遍历抽象语法树。

现在我必须使用直接处理字节码的框架(BAT - 字节码分析工具包)。

首先,catch block 在字节码中是如何表示的?我如何检测其中的 throw 语句?

最佳答案

每个方法都有一个异常表,将一系列指令和异常类型映射到异常处理程序(它的入口点)。这并不总是很容易转换回 Java 代码。但一般来说,您需要检查此表,然后分析来自这些入口点的可达代码。所有这些代码都属于 catch 子句。然后只需识别 athrow 指令即可。

使用 javap 或其他好的字节码可视化工具来尝试并更好地理解它。完成您的代码,对其进行编译并将其提交给 javap 会产生:

public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public static void def() throws java.io.IOException;
Code:
0: new #2; //class java/io/IOException
3: dup
4: invokespecial #3; //Method java/io/IOException."<init>":()V
7: athrow

public static void main(java.lang.String[]) throws java.io.IOException;
Code:
0: invokestatic #4; //Method def:()V
3: goto 19
6: astore_1
7: aload_1
8: athrow
9: astore_1
10: new #6; //class java/lang/RuntimeException
13: dup
14: aload_1
15: invokespecial #7; //Method java/lang/RuntimeException."<init>":(Ljava/lang/Throwable;)V
18: athrow
19: return
Exception table:
from to target type
0 3 6 Class java/io/IOException

0 3 9 Class java/lang/Exception


}

对于 main 方法,我们有 2 个异常入口点(“目标”):6 和 9。在 6 之后,我们在偏移量 8 处有一个 athrow。在入口之后指向 9,我们在偏移量 18 处有一个 athrow。就是这样!

关于java - 通过分析字节码,我如何检测 catch block 中的显式 throw 语句调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18413094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com