Javassist - Numeri c операций в теле метода CtMethod выбрасывает java .lang.VerifyError - PullRequest
1 голос
/ 16 марта 2020

Пожалуйста, смотрите ниже код создания класса и метода с использованием 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: (класс: формулы, метод: Formula Signature: (Lcom / Formbuilder / FormulaAPI;) Ljava / lang / Double;) Неправильный тип возврата в функции

Не поддерживает ли Javassist поддержка чисел c операций в теле метода? Я пытаюсь вызвать метод и добавить число к нему, прежде чем он возвращает значение, как показано ниже:

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

Как я могу достичь числительных c операций, таких как +, *, /, <, <= и др c. в теле метода? </p>

1 Ответ

1 голос
/ 16 марта 2020

Проблема, скорее всего, в том, что javassist не поддерживает автобокс. Так что java.lang.Double не совместимо с double. Операторы Numeri c доступны только для примитивных типов.

Поэтому, если вы хотите сохранить подписи, вам нужно самостоятельно убрать / распаковать объекты / примитивы.

Что-то вроде

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

(вы можете добавить обработку null, если evaluate() может вернуть null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...