Jexl3中自定义类的运算符重载/定义

时间:2017-09-20 15:17:15

标签: java operator-overloading jexl

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

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

其中ab是包含boolean的自定义类的实例,以及应通过已评估的表达式执行的额外信息,以便最终可以访问它result

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

我已尝试通过自定义实现扩展UberspectJexlArithmetic,但我发现只使用toBoolean我可以将自定义对象转换为Boolean(这使得result一个Boolean - 因此我放弃了所有额外信息。)

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

2 个答案:

答案 0 :(得分:2)

只需扩展 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);

答案 1 :(得分:1)