Rhino Javascript:如何将Object转换为Javascript原语?
我在这个项目中使用javax.scripting和Rhino。
我有一个Java方法返回Java对象(Double,Long,Integer等)。 我想从javascript调用该方法并将结果作为Javascript基元类型引用。 但是,javacript将返回类型识别为Object。
如何强制它转换为javascript原语?
此问题与http://groups.google.com/group/mozilla.dev.tech.js-engine.rhino/browse_thread/thread/2f3d43bb49d5288a/dde79e1aa72e1301非常相似
问题是我如何获得对上下文和WrapFactory的引用?
示例代码:
public class data { Double value = 1.0d; public Number get() { return value; } } public static void main(String[] args) { ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); data data = new data(); try { engine.eval("function test(data) { return data.getD('value1') + 5;};"); System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); } catch (Exception e) { e.printStackTrace(); } }
输出:结果:15
请尝试以下方法
public static void main(String [] args) throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); data data = new data(); Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); try { engine.eval("function test(data) { return data.get('value1') + 5;};"); System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); } catch (Exception e) { e.printStackTrace(); } } public static class data { Double value = 1.0d; public Number get(String arg) { return value; } }
或者,您可以修改javascript函数以将值显式转换为数字:
function test(data) { return parseInt(data.get('value1'), 10) + 5;}
在JavaScript代码中使用以下内容作为输出:
function aFunction(data) { return parseInt(data); }
我开发了这个应用程序,您可以在其中输入一组数学公式,这些公式将由Java 6中内置的JavaScript引擎进行评估,我相信它是一个犀牛的端口。 我们的想法是,我们将拥有一组地图,这些地图将包含变量,例如:
MAP["VALUE 1"] MAP["VALUE 2"]
我使用这种方法,因为公式的一些表达式来自我控制下的变量,可能是无效的JS标识符。 我的第一种方法是声明一个地图并将其添加到JS引擎中,但它失败的方式与它失败的方式相同 – 它将其解释为字符串,而不是数字。
解决方案是解析公式,找出它使用的变量,然后在JS引擎中声明对象。
像这样的东西:
var MAP = new Object(); MAP["VALUE 1"] = 1; MAP["VALUE 2"] = 2;
然后MAP["VALUE 1"] + MAP["VALUE 2"]
将返回3
,而不是12
。
可能有一个更好的解决方案,但是一旦你进行初始编码/解析,上面的内容将始终有效。 在我们的例子中,我们执行“声明性”语句,以及执行公式的另一个阶段。 JS引擎非常快,所以对我们来说不是问题。