1

这与关于数组的其他 SO question非常相似。

如果我评估:

y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"}

在通过 JSR223 (ScriptingEngine) 实例化的 Javascript 脚本中,我得到了NativeObject某种(我在 Eclipse 的调试器中看到这个)并且不知道如何访问它的属性。此外,我什至不知道哪个 .jar 文件(如果有),我需要添加到我的构建路径才能使用相关类,如果我找到一种适用于 Rhino Javascript 的方法,它对杰通。

似乎 JSR223 应该包含对 ScriptingEngine 的与语言无关的访问方法,以提供将返回的对象包装为List<Object>用于数组或Map<String, Object>用于关联数组的能力。

有什么建议么?

4

2 回答 2

0

我也在尝试嵌入具有比 jsr223 或 bsf 更多功能的不同脚本语言。为此,我必须定义自己的接口并围绕每个不同的脚本引擎实现这些。

我想要的一个功能是能够将函数(具有单个方法的 java 接口)传递给我的脚本引擎,并在传递参数时让它工作。我的每个嵌入式脚本引擎都有一个层,我在其中从脚本环境中包装/解包到 java 值。

我建议解决问题的最佳方法是让您的脚本引擎包装器提供一个 getValue(String name) 并让它修复将它们转换为 java 列表的 javascript 数组。当然 setValue(String, Object) 会检查该值是否为 List 并将其转换回 js 数组等等。它的乏味:()

于 2011-08-01T04:40:30.527 回答
0

将其转换为 java 对象并返回它。然后,您可以像往常一样使用 java 对象。

下面是一个示例转换函数

function convertToJava(o) {
    var rval;
    if (Array.isArray(o)) {
        rval = new java.util.ArrayList();
        for (var key in o) {
            rval.add(convertToJava(o[key]));
        }
    } 
    else if (typeof o === 'object') {
        rval = new java.util.HashMap();
        for (var key in o) {
            rval.put(key, convertToJava(o[key]));
        }
    }
    else if (typeof o === 'function') {
        // skip
    }
    else if (typeof o === 'undefined') {
        // skip
    }
    else {
        rval = o;
    }
    return rval;
}
于 2012-02-10T02:05:49.293 回答