Jexl выполняет динамическое преобразование строк - PullRequest
0 голосов
/ 13 июня 2019

Я строю оценщик, который использует JEXL. Я знаю, как представить рабочие пространства в Jexl, но это позволяет только определение класса, мне нужно определить определение метода. В следующем примере, чтобы получить доступ к функции журнала Math, я должен добавить это в контекст функции. Я хочу иметь возможность оценить выражение: "log (5)", т.е. без использования классификатора.

Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put("math", Math.class);

JexlEngine jexl = new JexlBuilder().namespaces(funcs).create();
JexlExpression je = jexl.createExpression("math:log(5)");
je.evaluate();

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете использовать пространство имен 'null', если Math является единственным источником функций.

Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put(null, Math.class);
JexlEngine jexl = new JexlBuilder().namespaces(funcs).create();
JexlExpression je = jexl.createExpression("log(5)");
Object result = je.evaluate(null);
Assert.assertNotNull(result);

Если вам нужно больше, чем Math в качестве источника, боюсь, вам придется создать свой собственный класс, который делегирует каждый метод его источникам.

...