我想要检测catch块中发生的抛出语句。例如:
try
{
def();
}
catch (IOException e)
{
throw e;
}
catch (Exception e)
{
throw new RuntimeException(e);
}首先,我使用Eclipse-JDT来检测这些情况,这非常简单,因为我可以遍历抽象语法树。
现在,我必须使用一个直接处理字节码的框架(BAT - bytecode Analysis Toolkit)。
首先,catch块在字节码中是如何表示的?我怎样才能在其中检测到一条抛出语句呢?
发布于 2013-08-24 07:06:32
每个方法都有一个异常表,该表将一系列指令和异常类型映射到一个异常处理程序(它是入口点)。这并不总是很容易转换回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,我们有两个异常入口点(“目标”):6和9。在6之后,我们在偏移量8处有一个athrow。在9处入口点之后,我们在偏移量18处有一个athrow。就是这样!
https://stackoverflow.com/questions/18413094
复制相似问题