2012-06-20 20 views
22

私は今、私がしたいのですがJavascriptがBindメソッド呼び出し

function js_main(args){ 
    /* some code */ 
    var x = api_method1(some_argument); 
    /* some code */ 
} 

をファイルと私はjavax.scriptingで通常の方法

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("javascript"); 
engine.eval(...); 

それを実行しようとしていると仮定JavaクラスでJavascriptでapi_method1への呼び出しを処理します。私は、呼び出しのスクリプトが呼び出されることになる(エンジンと同じクラスに)方法

public Object api_method1(Object arg){ ... } 

api_method1(arg)呼び出しすなわち毎回結合/マッピングのいくつかの種類を持っていたいです。

これを達成できますか?

答えて

15
  1. engine.createBindings()を使用してBindingsオブジェクトを作成します。あなたが呼び出すことができ

    はJavaScriptで次に
    Bindings b = engine.createBindings(); 
    b.put("api", yourApiObject); 
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE); 
    
  2. グローバル "API" オブジェクトがあります:

    api.method1("foo", 14, "whatever"); 
    
  • は、いくつかの名前でバインディングにあなたの方法を暴露する対象物を置きます

    施設は使いやすいですが、行き来するものには注意してください。 JavaScriptの型をJavaの型に変換することはそれほどありません。

    +0

    (プリミティブの他に)メソッドとの間でデータをマーシャリングする方法について教えてください。 – emesx

    +1

    プリミティブ以外のデータを渡す場合は、JSONを使用できます。 Javaコードは、JSONライブラリを使用してJSONをシリアル化/逆シリアル化できます。 – sperumal

    +1

    あなたはそれのためにかなりあなた自身である。あなたはJSON(JavaScriptから簡単に)にシリアライズして、Javaで逆シリアル化することができます(それほど簡単ではありませんが、実行可能です)。あるいは、さまざまなユーティリティを公開して、他のJavaオブジェクト型を組み合わせることもできます。 – Pointy

    関連する問題