javascript - Nashorn 将 Java 函数分配给映射

标签 javascript java java-8 nashorn

我有这个引擎,它运行用户输入(受信任)的 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/

相关文章:

javascript - 圆 Angular 变成矩形?

java - 饼图添加onclick功能

java - 如何在使用 createArrayOf() 方法时纠正 'java.sql.SQLFeatureNotSupportedException'

javascript - addParameter javascript(用于xslt)函数不起作用

javascript - 以更清晰的方式仅从数组中获取特定值

更新到 Java 8 后,Android 以错误的编码显示文本

java - 使字符串连续所需的最少更改 x 数量A 的之后,然后是 (n-x) 个 B 的之后

java - 计算对象图中多个数字的平均值

javascript - 将响应式菜单从 jQuery 转换为 MooTools 1.4.x

java - 在 Spring 中允许并发的正确 Bean 的 proxyMode 是什么?