请参见以下使用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
问题很可能是javassist不支持自动装箱。因此java.lang.Double与不兼容double。数值运算符仅适用于基本类型。
因此,如果要保留签名,则需要自己对对象/基元进行装箱/拆箱。
就像是
String methodBody = "return java.lang.Double.valueOf($1.evaluate(\"L\").doubleValue() + 25.0d);";
(null如果evaluate()可以返回,则可能要添加处理null)
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。