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();
}
После вызова этого метода я получаю ошибку:
Исключение в потоке "main" java.lang.VerifyError: (класс: формулы, метод: подпись формулы1: (Lcom/formulabuilder/FormulaAPI;)Ljava/lang/Double;) Неверный тип возвращаемого значения в функции
Javassist не поддерживает числовые операции в теле метода? Я пытаюсь вызвать метод и добавить к нему номер, прежде чем он вернет значение, как показано ниже:
String methodBody = "return ($w)($1.evaluate(\"L\") + 25.0);";
Как я могу выполнить числовые операции, такие как +, *, /, <, <= и т.д. в теле метода?
1 ответ
Проблема, скорее всего, в том, что javassist не поддерживает автобокс. Такjava.lang.Double
не совместим с double
. Числовые операторы доступны только для примитивных типов.
Поэтому, если вы хотите сохранить подписи, вам нужно самостоятельно упаковать / распаковать объекты / примитивы.
Что-то типа
String methodBody = "return java.lang.Double.valueOf($1.evaluate(\"L\").doubleValue() + 25.0d);";
(вы можете добавить null
обработка, если evaluate()
может вернуться null
)