2013-02-11 8 views
5

Javaメソッドを公開して、任意のスクリプトで呼び出せるようにしたい。スクリプトは、戻り値に対して算術演算を実行できる必要があります。Rhino:JavaScriptから呼び出されるJavaメソッドから整数を返す方法は?

公開されたメソッドは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

答えて

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

あなたはそのコードは、問題を解決する方法を説明してもらえますか? –

関連する問題