4

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

"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 或我知道存在不匹配的操作数的东西。

4

5 回答 5

2

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

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

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

于 2010-06-07T18:49:17.240 回答
0

MVEL 也很有用

http://mvel.codehaus.org/

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

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

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

于 2012-10-18T01:19:24.047 回答
0

试试评估项目

于 2010-06-07T18:45:45.733 回答
0

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

于 2013-10-15T14:56:03.403 回答
0

使用亚尼诺!http://docs.codehaus.org/display/JANINO/Home

它就像 java 的 eval

于 2012-10-18T00:39:51.037 回答