我有一个用Java编写的过滤应用程序,它将允许我根据公司的基本原理(例如税前利润,股息收益率等)过滤公司。
我已经创建了一个过滤引擎,目前它是硬编码的,可以接受编译时给出的过滤器。
我想做的是打开一个web服务,在那里我可以传入JSON来运行过滤,使用在运行时定义和传入的过滤器。
为此,我需要以某种方式将字符串转换为Java代码。
例如JSON中的字符串
current.preTaxProfit > previous.preTaxProfit
在Java代码中加入:
return current.getPreTaxProfit() > previous.getPreTaxProfit();
我的主要问题是解析数学字符串,如:
current.preTaxProfit > (previous.preTaxProfit * 1.10)
事情很快就会变得非常复杂,特别是当涉及到内括号之类的,以及遵守BODMAS时。
有没有专门用于解析数学字符串的库,或者有人知道有什么好的资源可以帮助我吗?
例如,我发现了这个:
Javaassist: http://davidwinterfeldt.blogspot.co.uk/2009/02/genearting-bytecode.html
有人有使用Javaassist的经验吗?在我的体系结构中,我传入具有实现的"回调"方法的对象,因此创建整个类和方法的能力可能很有用。
两种可能:
- Java脚本API:
- EL,表达式语言。
脚本API可能是最快获得结果的,但是EL更好。
考虑使用表达式语言,例如JEXL。
如果您将current
和previous
放入上下文中,只需计算:
current.preTaxProfit > (previous.preTaxProfit * 1.10)
完整的示例:
// create context
JexlContext jc = new MapContext();
context.set("current", someObject);
context.set("previous", anotherObject);
// create expression
String jexlExp = "current.preTaxProfit > (previous.preTaxProfit * 1.10)";
Expression e = jexl.createExpression(jexlExp);
// evaluate
Object result = e.evaluate(jc);