我希望能够评估存储为字符串的布尔表达式,如下所示:
"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或一些让我知道操作数不匹配。
答案 0 :(得分:2)
在Java 6中,您可以动态调用编译器,如本文所述:
http://www.ibm.com/developerworks/java/library/j-jcomp/index.html
您可以使用它将表达式动态编译为Java类,如果您尝试将字符串与数字进行比较,则会抛出类型错误。
答案 1 :(得分:0)
答案 2 :(得分:0)
使用Janino! http://docs.codehaus.org/display/JANINO/Home
就像java的eval一样
答案 3 :(得分:0)
MVEL也很有用
在大多数情况下进行评估的一行代码:
Object result = MVEL.eval(expression, rootObj);
“rootObj”可以为null,但如果提供了它,您可以在没有限定条件的情况下引用其上的属性和方法。即。 “id”或“calculateSomething()”。
答案 4 :(得分:0)
如果groovy是一个选项,你可以试试http://groovy.codehaus.org/api/groovy/util/Eval.html。