Jexl 执行动态字符串转换

Jexl perform dynamic string transformation

我正在构建一个在底层使用 JEXL 的求值器。我知道如何在 Jexl 中引入工作区,但是那只允许 class 定义,我需要定义一个方法定义。在下面的示例中,为了访问 Math 的 log 函数,我必须将其添加到函数上下文中。我希望能够计算一个表达式:"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();

如果 Math 是函数的唯一来源,您可以使用 'null' 命名空间。

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);

如果您需要的不仅仅是数学作为来源,恐怕您将不得不创建自己的 class 将每个方法委托给它的来源。