我正在尝试在Jexl表达式中实现一个应该像Boolean
一样的自定义类:
实施例:
Object result = jexl.createExpression("a || b").evaluate(context)
其中a
和b
是包含boolean
的自定义类的实例,以及应通过已评估的表达式执行的额外信息,以便最终可以访问它result
。
我已经读过Jexl3应该支持运算符重载,它似乎具有为自定义类定义自己的运算符所需的所有结构 - 但是我无法理解这样做需要哪些步骤。
我已尝试通过自定义实现扩展Uberspect
和JexlArithmetic
,但我发现只使用toBoolean
我可以将自定义对象转换为Boolean
(这使得result
一个Boolean
- 因此我放弃了所有额外信息。)
如何正确使用/扩展Jexl以为自定义类提供布尔运算符?
答案 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)
你走在正确的道路上,你需要扩展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中有一个测试/示例。