通过分析字节码,我如何能够检测明确throw语句调用从catch块?(By analyzing th

2019-10-18 13:48发布

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

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

首先,我使用Eclipse的JDT检测到这些情况,这是很简单的,因为我可以遍历抽象语法树。

现在,我必须使用一个框架(BAT - 字节码分析工具)直接与字节代码交易。

首先,如何catch块的字节码来表示? 而且我怎么能在其中发现一个throw语句?

Answer 1:

每种方法都有一个映射范围的指令以及与异常类型到一个异常处理程序(它的入口点)一个异常表。 这不是一件容易的转换回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?