【发布时间】:2017-04-12 18:51:29
【问题描述】:
我有一个看起来像这样的 JavaScript 脚本:
function run(database) {
var result = database.query("query", "some resource name");
//operations on result
return result;
}
我有 Java 代码来执行类似这样的脚本:
public Object execute(String script, Database database) {
NashornScriptEngineFactory nsef = new NashornScriptEngineFactory();
ScriptEngine engine = nsef.getScriptEngine();
try {
engine.eval(script);
Invocable invocable = (Invocable) engine;
return invocable.invokeFunction("run", database);
} catch(ScriptException e) {
throw new RuntimeException(e);
}
}
Database 是一个包含多个方法定义的接口,但不 包含query 方法。我用Database 的实现调用execute,调用它DatabaseImpl,确实 有query 方法。这将是多态的,并且脚本应该知道传递给它的 Database 实例上可用的方法。我决定不使用泛型,因为它们在运行时会被删除,所以 JavaScript 无论如何都无法使用它们,所以由脚本编写者来获得正确的类型。
但是,当我运行此代码时,出现以下异常:
javax.script.ScriptException: TypeError: database.query is not a function in <eval> at line number 25
基本上,要点是,我有一个实现接口的对象,并调用特定实例实现的方法,但不是接口定义的一部分。我的印象是这应该仍然有效,但它没有。对我来说,我需要在脚本中进行子转换才能访问 query 方法(这甚至可能吗?),所以我为什么会收到这个错误?是因为接口定义中没有该方法吗?有解决办法吗?
谢谢。
【问题讨论】:
标签: javascript java java-8 nashorn