2013-02-11 154 views
5

我想公开一个Java方法,以便它可以被任意脚本调用。该脚本应该能够对返回值执行算术运算。Rhino:如何从JavaScript调用的Java方法返回一个Integer?

的问题是,虽然暴露方法返回一个Java Integer,脚本实际上并没有得到正规数,但org.mozilla.javascript.NativeJavaObject一个实例。

下面是一些简单的测试代码,显示的行为:

public class RhinoTest 
{ 
    public static void main(String[] args) 
    { 
     String script = "foo.getBar() + 1"; 
     Context context = Context.enter(); 
     ScriptableObject scriptableObject = context.initStandardObjects(); 
     ScriptableObject.putProperty(scriptableObject, "foo", new Foo()); 
     Object result = context.evaluateString(scriptableObject, script, "FooBar", 1, null); 
     Context.exit(); 
     System.out.println(result); 
    } 

    public static class Foo 
    { 
     public Integer getBar() 
     { 
      return 9; 
     } 
    } 
} 

预期的结果是10,但该脚本返回91

那么我怎样才能让getBar()内部脚本发生的调用实际返回一个正常的Javascript数据类型呢?请注意,我不想通过添加unwrap()调用,等来更改脚本代码。

+0

尝试'¨foo.getBar()'+ 1 – subodh 2013-02-11 09:54:23

回答

3

修改您的上下文WrapFactory

context.getWrapFactory() 
     .setJavaPrimitiveWrap(false); 
-2
public static void main(String[] args) 
    { 
    int value = new Foo().getBar()+1; 
    String script = String.valueOf(value); 
    Context context = Context.enter(); 
    ScriptableObject scriptableObject = context.initStandardObjects(); 
    ScriptableObject.putProperty(scriptableObject, "foo", new Foo()); 
    Object result = context.evaluateString(scriptableObject, script, "FooBar", 1, null); 
    Context.exit(); 
    System.out.println(result); 
    } 
    public static class Foo 
    { 
    public Integer getBar() 
    { 
    return 9; 
    } 
    } 
+0

你能解释一下代码是如何解决这个问题? – 2013-06-05 11:34:41

相关问题