我有这个引擎,它运行用户输入(受信任)的 javascript 函数,以使用 Nashorn 为他们过滤一些数据。不想详细说明需求,但我们假设它是某种插件系统。
此 JavaScript 获取 Java 映射(其作用类似于 JS 对象)作为参数来获取一些上下文数据。 所以我想为用户添加一些方便的扩展方法到这个JS对象。所以我做了以下事情:
Map<String, String> inputMap = ....
inputMap.put("containsMagic", (Function<String, Boolean>) param -> some complex magic check and return boolean);
完美运行!
if(inputMap.containsMagic('Im Por Ylem'))
do stuff;
但是,我希望它也不接受任何参数,因为 null 是一个有效值,并且 containsMagic()
看起来比 containsMagic(null)
更好。
if(inputMap.containsMagic())
do stuff;
但我明白了:
TypeError: Can not invoke method ......$$Lambda$15/1932831450@30c15d8b with the passed arguments; they do not match any of its method signatures.
考虑到 Java 的工作原理,我想这很正常。如果我传递 null,它当然可以工作,但这不是很直观。
我无法添加另一个具有 0 个参数和相同名称的函数,因为 Java 映射是单键的。 复杂的魔术检查需要在java中,所以我也不能分配一个javascript函数(JSObject?)。我有什么想法可以实现这一点吗?
最佳答案
您可以将 containsMagic
实现为带有 varargs 参数的显式方法:
public static class InputMap extends HashMap<String, Object> {
public Boolean containsMagic(String... args) {
String arg = args.length == 1 ? args[0] : null;
// do magic
}
}
...
Map<String, Object> inputMap = new InputMap();
关于javascript - Nashorn 将 Java 函数分配给映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32633925/