2

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

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

4

3 回答 3

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;}
于 2009-10-16T19:03:32.837 回答
0

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

function aFunction(data)
{
  return parseInt(data);
}
于 2009-10-17T01:50:36.843 回答
0

我开发了这个应用程序,您可以在其中输入一组数学公式,这些公式将由 Java 6 中内置的 JavaScript 引擎进行评估,我相信这是 rhino 的一个端口。我们的想法是我们将有一组地图,这些地图将包含变量,例如:

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

于 2009-10-17T05:52:48.387 回答