我想检测从catch块内发生的throw语句。 例如:
try
{
def();
}
catch (IOException e)
{
throw e;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
首先,我使用Eclipse的JDT检测到这些情况,这是很简单的,因为我可以遍历抽象语法树。
现在,我必须使用一个框架(BAT - 字节码分析工具)直接与字节代码交易。
首先,如何catch块的字节码来表示? 而且我怎么能在其中发现一个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,我们有一个athrow
偏移量8.继9切入点,我们有一个athrow
在偏移18.这就是它!
文章来源: By analyzing the bytecode, how can I detect explicit throw statement invocations from within a catch block?