【问题标题】:Implementing Java interface from JavaScript fails with a TypeError从 JavaScript 实现 Java 接口失败并出现 TypeError
【发布时间】:2012-07-19 09:36:24
【问题描述】:

我有一个接口ru.focusmedia.odp.server.scripts.api.Script,并尝试按照http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html中的例子来实现它:

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] 不是函数,它是 sun.org。 mozilla.javascript.internal.NativeJava包。 (#1) 在第 1 行

new Packages.java.lang.Runnable() 有效。有什么问题?

更新:我最初认为setting thread context class loader 解决了这个问题,但在脚本稍作更改后再次出现。

【问题讨论】:

    标签: java scripting interface rhino jsr223


    【解决方案1】:

    这是无效的 JavaScript:

    new Object() {};
    

    它正在用“new”调用一个函数,但未能终止语句,然后一个大括号表示一个对象字面量的开始(这是 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 2019-12-26
      • 1970-01-01
      • 2015-11-08
      • 2017-10-21
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多