我可以严格评估在Java中存储为字符串的布尔表达式吗?

我希望能够评估存储为字符串的布尔表达式,如下所示:

"hello" == "goodbye" && 100 < 101 

我知道SO上已经有很多这样的问题了,但是我问这个问题因为我已经尝试过这个问题最常见的答案, BeanShell ,它允许评估像这样的语句

 "hello" == 100 

没有任何麻烦。 有没有人知道一个FOSS解析器会抛出操作数不匹配等错误? 或者BeanShell中有一个设置可以帮助我吗? 我已经尝试过Interpreter.setStrictJava(true)。

为了完整起见,这是我目前使用的代码:

 Interpreter interpreter = new Interpreter(); interpreter.setStrictJava(true); String testableCondition = "100 == \"hello\""; try { interpreter.eval("boolean result = ("+ testableCondition + ")"); System.out.println("result: "+interpreter.get("result")); if(interpreter.get("result") == null){ throw new ValidationFailure("Result was null"); } } catch (EvalError e) { e.printStackTrace(); throw new ValidationFailure("Eval error while parsing the condition"); } 

编辑:

我目前的代码返回此输出

 result: false 

没有错误。 我想要它做的是抛出一个EvalError或让我知道有不匹配的操作数的东西。

在Java 6中,您可以动态调用编译器,如本文所述:

http://www.ibm.com/developerworks/java/library/j-jcomp/index.html

您可以使用它将表达式动态编译为Java类,如果您尝试将字符串与数字进行比较,则会抛出类型错误。

尝试eval项目

使用Janino! http://docs.codehaus.org/display/JANINO/Home

就像java的eval一样

MVEL也很有用

http://mvel.codehaus.org/

在大多数情况下,一行代码进行评估:

 Object result = MVEL.eval(expression, rootObj); 

“rootObj”可以为null,但如果提供了它,您可以在没有限定条件的情况下引用其上的属性和方法。 即。 “id”或“calculateSomething()”。

如果groovy是一个选项,您可以尝试使用http://groovy.codehaus.org/api/groovy/util/Eval.html 。