在运行时将字符串解析为Java代码

时间:2014-05-12 19:28:42

标签: java reflection

我有一个用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的经验?在我的架构中,我传递了对象'回调'实现的方法,因此创建整个类和方法的能力可能很有用。

2 个答案:

答案 0 :(得分:1)

考虑使用表达式语言,例如JEXL

如果您将currentprevious放入上下文中,只需评估:

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)

两种可能性:

  • Java Scripting API:
  • EL,表达语言。

脚本API可能最快获得结果,但EL更好。