Rhino Javascript:如何将Object转换为Javascript原语?

时间:2009-10-16 18:53:35

标签: java javascript rhino

我正在使用带有Rhino的javax.scripting 在这个项目中。

我有一个返回Java对象的Java方法(Double,Long, 整数等)。我想从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

3 个答案:

答案 0 :(得分:3)

尝试以下

 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;}

答案 1 :(得分:0)

在JavaScript代码中使用以下内容作为输出:

function aFunction(data)
{
  return parseInt(data);
}

答案 2 :(得分:0)

我开发了这个应用程序,您可以在其中输入一组数学公式,这些公式将由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引擎非常快,所以对我们来说这不是问题。