2

我正在尝试实现一个应该Boolean在 Jexl 表达式中表现得像的自定义类:

例子: Object result = jexl.createExpression("a || b").evaluate(context)

Whereabare 自定义类的实例,其中包含一个boolean额外的信息,应该通过评估的表达式进行,以便最终可以在result.

我已经读过 Jexl3 应该支持运算符重载,并且它似乎具有为自定义类定义自己的运算符的所有必要结构 - 但是我无法理解这样做需要哪些步骤。

我已经尝试通过自定义实现来扩展Uberspect和扩展JexlArithmetic,但是我只发现使用toBoolean我可以将我的自定义对象转换为Boolean(这使得- 因此我丢失了所有额外的信息)resultBoolean

如何正确使用/扩展 Jexl 为自定义类提供布尔运算符?

4

2 回答 2

3

只需扩展JexlArithmetic类并在其中覆盖方法。

public class ExtendedJexlArithmetic extends JexlArithmetic
{
    public Object or(YourCustomClass left, YourCustomClass right)
    {
            return left.or(right); // make sure you've implemented 'or' method inside your class
    }
}

然后在下面尝试:

JexlContext jexlContext = new MapContext();

jexlContext.set("a", new YourCustomClass());
jexlContext.set("b", new YourCustomClass());

JexlEngine jexlEngine=new JexlBuilder().arithmetic(new ExtendedJexlArithmetic (true)).create();

System.out.println(jexlEngine.createScript("a | b").execute(jexlContext);
于 2018-04-17T11:22:32.363 回答
1

您走在正确的道路上,您需要扩展 JexlArithmetic 并实现您的重载。http://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/JexlOperator.html中描述了各种可重载运算符。http://svn.apache.org/viewvc/commons/proper/jexl/tags/COMMONS_JEXL_3_1/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java?view=markup中有一个测试/示例#l666

于 2017-09-25T07:28:04.087 回答