【发布时间】:2016-10-20 21:51:53
【问题描述】:
我正在尝试将 "in1 && in2" 评估为布尔值作为测试,但我希望能够评估所有布尔值作为我实际项目的刺痛。 in1 和 in2 是具有布尔状态的节点的名称,我得到的实际表达式是这样的,
logic = logic.replaceAll(curName, (nodes.get(ins.get(j)).getState() ? "true" : "false"));
logic 是与我要评估的逻辑联系的字符串,curname 是当前节点名称被替换为其布尔值(例如“in1”)它在循环中,因此在评估字符串之前替换所有节点名称,节点是节点数组列表,ins 是节点数组中输入节点的索引,getState() 返回节点布尔值,这很好,将逻辑字符串的新值设置为“true && true”。
困难的部分是将字符串评估为布尔值。我发现我可以使用 javax.script 来帮助我here。所以我就这样实现了
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");
nodes.get(outs.get(i)).setState((boolean)se.eval(logic));
问题是它每次都评估为 false,当我尝试将 eval 返回的对象转换为布尔值并尝试像这样显示它时,
System.out.printLine(String.valueOf((boolean)se.eval(logic)));
它只返回 false。
在oracle's page on eval 上,我看到还有一些其他参数可以传递给 eval,我是缺少其中一个还是完全是其他的?
*旁注,这在我未在此处显示的任何代码中都不是问题,我已经使用原始布尔值而不是字符串测试了评估。
【问题讨论】:
-
您需要向我们展示您传递给 ScriptEngine 的字符串的内容,以及您如何在 ScriptEngine 环境中设置任何变量的值。顺便说一句,在这里使用 ScriptEngine 可能是矫枉过正。您正在一个巨大的环境中完成一些在 Java 中可能很容易完成的事情。
-
经过转换后"in1 && in2"被转换为"true && true",也就是eval()传过来的,至于脚本引擎环境的值,代码我发布的是我在整个项目中提到脚本引擎的所有内容,我只是从here 复制它,认为它会有所帮助。
-
您可以考虑查看表达式语言 (EL),尤其是 Spring Expression Language (SpEL) 等变体。
标签: java scriptengine javax.script