通过JSR223在Rhino和Java之间进行互操作:使用Javascript Object实例

时间:2011-04-08 18:19:09

标签: java rhino jsr223

这与this other SO question about arrays非常相似。

如果我评估:

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

在通过JSR223(ScriptingEngine)实例化的Javascript脚本中,我得到某种类型的NativeObject(我在Eclipse的调试器中看到这一点),并且不知道如何访问其属性。此外,我甚至不知道哪个.jar文件,如果有的话,我需要添加到我的构建路径,以便能够使用相关的类,如果我找到一个在Rhino Javascript中工作的方法,它是没用的Jython的。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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;
}