2012-07-20 62 views
3

我有一個接口ru.focusmedia.odp.server.scripts.api.Script並試圖根據http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html例子來實現它:從JavaScript實現Java接口失敗,一個TypeError

new Packages.ru.focusmedia.odp.server.scripts.api.Script() { 
    ... 
}; 

然而,這給出了以下異常:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: [JavaPackage ru.focusmedia.odp.server.scripts.api.Script] is not a function, it is sun.org.mozilla.javascript.internal.NativeJavaPackage. (#1) in at line number 1

new Packages.java.lang.Runnable()的作品。問題是什麼?

更新:我最初認爲setting thread context class loader解決了這個問題,但它在腳本的微小改變後重新發生。

回答

2

這是無效的JavaScript:

new Object() {}; 

它調用函數與「新」,但無法終止的聲明,然後一個開放的大括號指示對象文本的開始(這是有效的語法在Java中;它創建一個匿名子類)。奇怪的是,Rhino解釋不會抱怨,但它在瀏覽器的引擎正確地拋出一個錯誤:"SyntaxError: missing ; before statement"

嘗試使用對象編寫實現文字符號:

var impl = { 
    run: function() { 
     println('Hello, World!'); 
    } 
}; 

這裏有一個工作示例:

import javax.script.Invocable; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 

public class RhinoTest { 
    private static final String JAVASCRIPT_SRC = 
      " var impl = { " + 
      "  run: function() { " + 
      "   println('Hello, World!'); " + 
      "  } " + 
      " }; "; 

    public static void main(String[] args) throws Exception { 
     ScriptEngineManager factory = new ScriptEngineManager(); 
     ScriptEngine engine = factory.getEngineByName("JavaScript"); 
     engine.eval(JAVASCRIPT_SRC); 

     Object impl = engine.get("impl"); 
     Runnable r = ((Invocable) engine).getInterface(impl, Runnable.class); 
     r.run(); 
    } 
}