【发布时间】:2015-07-16 15:59:50
【问题描述】:
我有一个自定义的功能界面
public interface ThingFunction {
Object apply(Thing thing, String... flags);
}
我目前有一种存储它们以备后用的方法
public class Thing {
private static Map<String, ThingFunction> functions = new HashMap<>();
...
public static void addFunction(String key, ThingFunction function) {
functions.put(key, function);
}
...
public Object executeFunction(String key, String... flags) {
return functions.get(key).accept(this, flags);
}
...
}
我正在尝试通过 JS API(使用 Nashorn 引擎)公开这些函数。基本上,我希望用户能够编写像 function(thing, flags) {...} 这样的 JavaScript 函数,并将其作为 ThingFunction 存储在函数映射中。
我知道我可以将引擎设置为 Invocable 并使用 Invocable::getInteface(Class) 从 javascript 代码创建 ThingFunction
...
engine.eval("function apply(actor, flags) {return 'There are ' + flags.length + ' arguments';}");
Invocable invocable = (Invocable) enging;
ThingFunction function = invocable.getInterface(ThingFunction.class);
function.apply(thing, "this", "is", "a", "test");
...
但是,这种方法意味着我在引擎中只能有一个 apply 方法。有没有办法可以制作许多功能并将它们存储在如上所示的地图中?
【问题讨论】:
标签: javascript java java-8 nashorn