我有一个用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的经验?在我的架构中,我传递了对象'回调'实现的方法,因此创建整个类和方法的能力可能很有用。
答案 0 :(得分:1)
考虑使用表达式语言,例如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);
答案 1 :(得分:1)
两种可能性:
脚本API可能最快获得结果,但EL更好。