Javassist - CtMethod 方法主体中的数字操作抛出 java.lang.VerifyError
Javassist - Numeric operations in CtMethod method body throws java.lang.VerifyError
请参阅下面使用 javassist 创建 class 和方法的代码:
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)(.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();
}
调用此方法后,出现错误:
线程异常"main" java.lang.VerifyError: (class: 公式, 方法: formula1 签名: (Lcom/formulabuilder/FormulaAPI;)Ljava/lang/Double;) 错误的 return 类型函数
Javassist 不支持方法体中的数值运算吗?我正在尝试调用一个方法并在它之前添加一个数字 returns 值如下:
String methodBody = "return ($w)(.evaluate(\"L\") + 25.0);";
如何在方法体中实现+、*、/、<、<=等数值运算?
问题很可能是 javassist 不支持自动装箱。所以 java.lang.Double
与 double
不兼容。数值运算符仅适用于原始类型。
因此,如果您想保留签名,您需要自己 box/unbox objects/primitives。
类似于
String methodBody = "return java.lang.Double.valueOf(.evaluate(\"L\").doubleValue() + 25.0d);";
(如果 evaluate()
可以 return null
,您可能想要添加 null
处理)
请参阅下面使用 javassist 创建 class 和方法的代码:
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)(.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();
}
调用此方法后,出现错误:
线程异常"main" java.lang.VerifyError: (class: 公式, 方法: formula1 签名: (Lcom/formulabuilder/FormulaAPI;)Ljava/lang/Double;) 错误的 return 类型函数
Javassist 不支持方法体中的数值运算吗?我正在尝试调用一个方法并在它之前添加一个数字 returns 值如下:
String methodBody = "return ($w)(.evaluate(\"L\") + 25.0);";
如何在方法体中实现+、*、/、<、<=等数值运算?
问题很可能是 javassist 不支持自动装箱。所以 java.lang.Double
与 double
不兼容。数值运算符仅适用于原始类型。
因此,如果您想保留签名,您需要自己 box/unbox objects/primitives。
类似于
String methodBody = "return java.lang.Double.valueOf(.evaluate(\"L\").doubleValue() + 25.0d);";
(如果 evaluate()
可以 return null
,您可能想要添加 null
处理)