Java 如何插入字节码以告知何时执行catch子句?
根据他对此的评论,我想知道如何做到这一点 “如果您想使单元测试失败,在最一般的意义上,当此方法中的代码执行catch子句时,您必须插入字节码,以告知何时执行catch子句。这是一项复杂的任务。我不建议这样做。” 如何测试某个方法是否执行了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
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。