Javassist:生成“断言​​”语句

时间:2012-08-24 21:05:04

标签: assert javassist

我尝试在方法中添加“assert”语句。

但我得到了这个例外:

引起:编译错误:在mypackage.MyClassThatIsInstrumented中找不到assert(boolean)     在javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:716)     at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681)     at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156)     at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)     at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:241)     at javassist.compiler.CodeGen.atStmnt(CodeGen.java:329)     at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)     在javassist.compiler.CodeGen.atStmnt(CodeGen.java:350)     at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)     at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:291)     at javassist.compiler.Javac.compileBody(Javac.java:222)     at javassist.CtBehavior.setBody(CtBehavior.java:360)     ......还有30多个

任何想法如何解决?

1 个答案:

答案 0 :(得分:0)

解决方法是将断言实现为条件:

 if(Foo.class.desiredAssertionStatus() && expr) {
   throw new AssertionError();
 }

这基本上等同于

 assert expr;

现在问题就是如何注入它。如果需要断言方法参数,可以使用method.insertBefore();如果你断言结果,你可以使用method.insertAfter()。

如果语句需要插入到方法的主体中,在语句之间的某个位置,则可以使用ExprEditor来匹配您希望注入此新语句的所需语句