Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何插入字节码以告知何时执行catch子句?_Java_Exception_Bytecode - Fatal编程技术网

Java 如何插入字节码以告知何时执行catch子句?

Java 如何插入字节码以告知何时执行catch子句?,java,exception,bytecode,Java,Exception,Bytecode,根据他对此的评论,我想知道如何做到这一点 “如果您想使单元测试失败,在最一般的意义上,当此方法中的代码执行catch子句时,您必须插入字节码,以告知何时执行catch子句。这是一项复杂的任务。我不建议这样做。” 如何测试某个方法是否执行了catch子句?(以下示例中的ispatched()) 假设我有以下课程: public class A { public void method() { try { // some code that may or may not th

根据他对此的评论,我想知道如何做到这一点

“如果您想使单元测试失败,在最一般的意义上,当此方法中的代码执行catch子句时,您必须插入字节码,以告知何时执行catch子句。这是一项复杂的任务。我不建议这样做。”

如何测试某个方法是否执行了catch子句?(以下示例中的
ispatched()

假设我有以下课程:

public class A {
  public void method() {
    try {
      // some code that may or may not throw an exception
    } catch(Exception e) {
      // do nothing
    }
  }
}
然后在别的地方:

public class CatchTester {
  private A a;
  public CatchTester(A a) {
    this.a = a;
  }
  public boolean isCatched() {
    // how to do this?
  }
}

有两种方法,都需要掌握如何操作Java字节码的知识。可以使用诸如exist之类的工具来简化字节码的操作。然后可以连接到一个或编写一个自定义类加载器,在将类字节加载到JVM时对其进行修改


这种方法的一个很好的例子是。分配指令插入器修改类的字节码,以便在对象分配发生时可以注册调用的回调方法。想象一个类似的库用于try/catch指令插入并不难。

如果要通过指令插入检测某些代码已经执行,您必须修改代码,注入某种类型的日志代码,这将有效地回调记录此代码已被命中的事实的方法。然后,您可以在检查的方法返回后立即检查此类记录是否存在

虽然在每个异常处理程序的开头插入这样的日志代码并不困难,但问题是在字节码级别上,
catch
finally
try(…)之间没有区别
子句已生成。它们都以定义异常处理程序结束,其中一些可能会重新抛出捕获的异常。如果要排除重新抛出异常的处理程序,则必须跟踪每个可能的代码路径,从异常处理程序的条目开始,检查它是否以正常完成或抛出异常结束,要么是捕获的,要么是另一个新建的


如果您只想知道是否执行了任何
catch
子句,那么情况就简单多了。如果在
method()
的执行过程中抛出了异常,但是
method()没有
正常完成,即调用方没有收到异常,必须执行了异常处理程序。

我从未执行过任何字节码检测。我相信这是一个强大但微妙/复杂的工具。我的评论更多的是直觉(基于经验/预期)但我也很想知道这是否可能……我不明白
CatchTester
如何参与
a
。isCatched()调用
a.method();
并在捕获异常时返回true,否则返回false。