2012-06-20 17 views
22

假設我有一個JavaScript文件綁定方法調用中的Java腳本

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的調用。我想有某種映射/即腳本調用api_method1(arg)的方法

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

(放置在相同的類作爲發動機)將被稱爲每次呼叫的結合。

我可以做到這一點嗎?

回答

15
  1. 使用engine.createBindings()來創建Bindings對象;
  2. 把一個對象暴露你的方法與一些名綁定:

    Bindings b = engine.createBindings(); 
    b.put("api", yourApiObject); 
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE); 
    
  3. 在JavaScript

    然後就會有一個全球性的 「API」 對象,你可以撥打:

    api.method1("foo", 14, "whatever"); 
    

該設施易於使用,但要小心來回傳遞;它不會將JavaScript類型轉換爲Java類型。

+0

那麼將數據封送到方法(除了基元之外)呢? – emesx

+1

可以來回傳遞數據,而不是使用JSON的原始數據。您的Java代碼可以使用任何JSON庫序列化/反序列化JSON。 – sperumal

+1

對此你幾乎是你自己的。你可以序列化爲JSON(從JavaScript簡單),然後在Java中反序列化(不太容易,但可行)。或者你可以公開各種實用程序來拼湊其他Java對象類型。 – Pointy