java - Javassist - CtMethod 方法体中的数值操作抛出 java.lang.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 中的异常:(类:公式,方法:公式 1 签名:(Lcom/formulabuilder/FormulaAPI;)Ljava/lang/Double;)函数中的返回类型错误
Javassist 不支持方法体中的数字运算吗?我正在尝试调用一个方法并在它返回值之前添加一个数字,如下所示:
String methodBody = "return ($w)($1.evaluate(\"L\") + 25.0);";
如何在方法体中实现 +、*、/、<、<= 等数字运算?
解决方案
问题很可能是 javassist 不支持自动装箱。所以java.lang.Double
不兼容double
。数字运算符仅适用于原始类型。
因此,如果您想保留签名,您需要自己对对象/原语进行装箱/拆箱。
就像是
String methodBody = "return java.lang.Double.valueOf($1.evaluate(\"L\").doubleValue() + 25.0d);";
(如果可以返回,您可能需要添加null
处理)evaluate()
null
推荐阅读
- swift - 如何在 jazzy 中为特定目标构建文档?
- c# - 有没有什么办法可以用C把接口导出到C#来使用?
- sqlite - 缺少 SQLAlchemy 自动映射预期表
- android - 尝试创建未注册类型的平台视图:plugins.flutter.io/webview
- python - 访问 numpy 数组的所有元素
- c - 在c中对二维字符串数组进行排序
- python - 如何使用默认值而不是错误对熊猫数据框列进行切片
- javascript - 菜鸟试图解析入站短信的 webhook
- git - git pull rebase freeze
- python-3.x - 使用 python 使用 import xml.etree.ElementTree 将 XML 解析为 CSV