在Rhino中访问java Maps&Lists作为JavaScript对象
有没有办法在Rhino中访问Java Maps和Lists作为JavaScript对象?
我有一个Map只包含其他地图和基元和字符串列表,我想将它传递给Rhino脚本并对其进行处理,然后将修改后的对象返回给Java – 但由于它们是java.util .Map和java.util.List对象,我不能使用标准的JavaScript关联数组语法。 即: fooMap.get("keyName")
将起作用,但fooMap.keyName
和fooMap["keyName"]
不会。
我不知道是否有特定于Rhino的方法来执行此操作,或者是否有一些转换/强制转换实用程序可以提供帮助。 Commons BeanUtils是不够的,因为要将Map转换为bean(可以通过关联数组语法访问),首先必须创建一个包含所有命名mutator / accessors的类。 我不会在运行时知道对象的结构。
看看RingoJS。 它有一个方便的包装列表和Rhino的地图,如这个
https://developer.mozilla.org/en/New_in_Rhino_1.7R3#JS.c2.a0Objects_implement_Java_collections声称JS对象可以使用。 数组现在可以转换为Map
resp。 List
,但这似乎不适用于您的用例。
迭代器似乎是关键!
如果要迭代地图的所有条目,可以执行以下操作
JAVA
//pass the map and map.keySet().iterator() to the javascript Object wrappedParameterMap = Context.javaToJS(parameterMap, scope); ScriptableObject.putProperty(scope, "parameterMap", wrappedParameterMap); Object wrappedParameterNames = Context.javaToJS(parameterMap.keySet().iterator(), scope); ScriptableObject.putProperty(scope, "parameterNames", wrappedParameterNames);
JAVASCRIPT
while(parameterNames.hasNext()) { key = parameterNames.next(); value = parameterMap.get(key); }
我有一个类似的问题可能有用。 我尝试创建本机rhino对象并将数据复制到其中。