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

时间:2010-06-07 18:26:27

标签: java boolean eval beanshell

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

"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或一些让我知道操作数不匹配。

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

尝试eval project

答案 2 :(得分:0)

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

就像java的eval一样

答案 3 :(得分:0)

MVEL也很有用

http://mvel.codehaus.org/

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

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

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

答案 4 :(得分:0)

如果groovy是一个选项,你可以试试http://groovy.codehaus.org/api/groovy/util/Eval.html