我正在使用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是我想要避免的,因为它们非常大。
答案 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中实现该类型并使用该实现。