开发者社区> 问答> 正文

Javassist-CtMethod方法主体中的数值操作抛出VerifyError

请参见以下使用javassist创建类和方法的代码:

public Class generateClass(String className, String methodName)
            throws CannotCompileException, NotFoundException {
   ClassPool pool = ClassPool.getDefault();
   CtClass cc = pool.makeClass(className);

   ClassLoader classLoader = FormulaAPI.class.getClassLoader();
   pool.appendClassPath(new LoaderClassPath(classLoader));
   pool.importPackage("com.formula");

   String methodBody = "return ($w)($1.evaluate(\"L\") + 25.0);";

   CtClass apiClass = pool.get("com.formula.FormulaAPI");

   CtClass doubleWrapperClass = pool.get("java.lang.Double");

   CtMethod m = new CtMethod(doubleWrapperClass,methodName,new CtClass[]{apiClass},cc);
   m.setBody(methodBody);
   cc.addMethod(m);

   return cc.toClass();
}

调用此方法后,出现错误:

线程“主”中的异常java.lang.VerifyError:(类:Formulae,方法:Formula1签名:(Lcom / formulabuilder / FormulaAPI;)Ljava / lang / Double;)函数中的返回类型错误

Javassist是否不支持方法主体中的数字运算?我试图调用一个方法并向其添加一个数字,然后它返回如下值:

String methodBody = "return ($w)($1.evaluate(\"L\") + 25.0);";

如何在方法主体中实现+,*,/,<,<=等数字运算?

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 11:25:48 1235 0
1 条回答
写回答
取消 提交回答
  • 问题很可能是javassist不支持自动装箱。因此java.lang.Double与不兼容double。数值运算符仅适用于基本类型。

    因此,如果要保留签名,则需要自己对对象/基元进行装箱/拆箱。

    就像是

    String methodBody = "return java.lang.Double.valueOf($1.evaluate(\"L\").doubleValue() + 25.0d);";
    

    (null如果evaluate()可以返回,则可能要添加处理null)

    回答来源:Stack Overflow

    2020-03-23 11:26:35
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载