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引擎非常快,所以对我们来说不是问题。