1

我正在使用javax.script.*Rhino 在 Java 程序中编写脚本。

一个脚本可以很好地实现一个接口,但是当我尝试使用类似的语法来实例化一个抽象类(给出未实现方法的定义)时,我收到一个错误,说MyTestAbstractClass(我试图实例化的类)是一个接口或抽象的。我做错了什么吗?

这是我正在使用的 Javascript 代码:

var testObject  = new foo.mytestpackage.TestAbstractClass() {
    printMessage: function() {
        print("foo");
    }
};

何时TestAbstractClass是具有普通构造函数(无参数)的类,我得到以下堆栈跟踪:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: error instantiating (JavaAdapter: first arg should be interface Class (<Unknown source>#1)): class com.merkle.TestObject is interface or abstract (<Unknown source>#1) in <Unknown source> at line number 1
    at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source)
    at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source)
    at javax.script.AbstractScriptEngine.eval(Unknown Source)

我正在使用 Sun 的(我听说过稍微简化了)Rhino 实现,并且使用官方的 Rhino jars 是我想避免的,因为它们非常大。

4

1 回答 1

2

Oracle 的Java 7 JavaScript 引擎发行说明建议不支持实例化抽象类型:

犀牛的JavaAdapter已被覆盖。JavaAdapter是可以通过 JavaScript 扩展 Java 类并且可以通过 JavaScript 实现 Java 接口的特性。我们已经JavaAdapter用我们自己的实现替换了 Rhino 的JavaAdapter. 在我们的实现中,一个 JavaScript 对象只能实现单个 Java 接口。

错误消息似乎证实了这一点:

JavaAdapter: first arg should be interface Class (<Unknown source>#1)

如果您不愿意切换引擎,则必须在 Java 中实现该类型并使用该实现。

于 2013-05-16T13:36:36.903 回答