2012-08-24 116 views
0

我尝试向方法添加“声明”语句。Javassist:生成“声明”语句

但我得到这个异常:

引起的:在了Javassist断言(布尔)在javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:716)在mypackage.MyClassThatIsInstrumented 没有发现 :编译错误。 javassist.com处的javassist.compiler.ast.CallExpr.accept(CallExpr.java:45) 处的javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156) 。 compiler.CodeGen.doTypeCheck(CodeGen.java:241) at javassist.compiler.CodeGen.atStmnt(CodeGen.java:329) at javassist.comp iler.ast.Stmnt.accept(Stmnt.java:49) at 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 more

任何想法如何解决?

回答

0

一种解决方法是实施断言作为条件:

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

这基本上等同于

assert expr; 

现在是你想如何注入它的问题。如果您需要针对方法参数进行断言,则可以使用method.insertBefore();如果你断言结果,你可以使用method.insertAfter()。

如果语句需要插入方法体,某处语句之间,那么你可以使用ExprEditor来匹配要被注入这个新的声明所要求的声明