在Java Scripting中实例化Rhino解释器中的抽象类

时间:2013-05-01 19:56:10

标签: java abstract-class rhino

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

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

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

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

TestAbstractClass是一个具有普通构造函数(没有参数)的类时,我得到以下stacktrace:

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 jar是我想要避免的,因为它们非常大。

1 个答案:

答案 0 :(得分:2)

Oracle的release notes for Java 7's JavaScript Engine建议不支持实例化抽象类型:

  

Rhino的JavaAdapter已被覆盖。 JavaAdapter是可以通过JavaScript扩展Java类的功能,Java接口可以通过JavaScript实现。我们已将Rhino的JavaAdapter替换为我们自己的JavaAdapter实现。在我们的实现中,JavaScript对象只能实现单个Java接口。

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

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

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