3

我有一个接口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()作品。问题是什么?

更新:我最初认为设置线程上下文类加载器解决了这个问题,但在脚本中的微小更改后再次发生。

4

1 回答 1

2

这是无效的 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();
    }
}
于 2012-08-02T00:37:24.353 回答