首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过分析字节码,我如何从catch块中检测显式的throw语句调用?

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

Stack Overflow用户
提问于 2013-08-24 06:59:12
回答 1查看 469关注 0票数 1

我想要检测catch块中发生的抛出语句。例如:

代码语言:javascript
复制
try 
{
    def();
}
catch (IOException e)
{
    throw e;
}
catch (Exception e)
{
    throw new RuntimeException(e);
}

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

现在,我必须使用一个直接处理字节码的框架(BAT - bytecode Analysis Toolkit)。

首先,catch块在字节码中是如何表示的?我怎样才能在其中检测到一条抛出语句呢?

EN

回答 1

Stack Overflow用户

发布于 2013-08-24 07:06:32

每个方法都有一个异常表,该表将一系列指令和异常类型映射到一个异常处理程序(它是入口点)。这并不总是很容易转换回Java代码。但通常情况下,您需要检查此表,然后从这些入口点分析可访问的代码。所有这些代码都属于一个catch子句。然后就是识别athrow指令的问题了。

使用javap或其他好的字节码可视化工具来尝试并更好地理解它。完成代码、编译代码并将其提交给javap会产生以下结果:

代码语言:javascript
复制
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。就是这样!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18413094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档