通过JSR223实现Rhino和Java之间的互操作:使用Javascript对象实例

通过JSR223实现Rhino和Java之间的互操作:使用Javascript对象实例,java,rhino,jsr223,Java,Rhino,Jsr223,这很类似于 如果我评估: y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"} 在通过JSR223(ScriptingEngine)实例化的Javascript脚本中,我得到了某种NativeObject(我在Eclipse的调试器中看到了这一点),不知道如何访问它的属性。此外,我甚至不知道需要将哪个.jar文件(如果有的话)添加到我的构建路径中才能使用所讨论的类,而且如果我找到一种在RhinoJavaScr

这很类似于

如果我评估:

y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"}
在通过JSR223(ScriptingEngine)实例化的Javascript脚本中,我得到了某种
NativeObject
(我在Eclipse的调试器中看到了这一点),不知道如何访问它的属性。此外,我甚至不知道需要将哪个.jar文件(如果有的话)添加到我的构建路径中才能使用所讨论的类,而且如果我找到一种在RhinoJavaScript中工作的方法,它对Jython是无用的

似乎JSR223应该包含与语言无关的ScriptingEngine访问方法,以提供将返回对象包装为数组的
列表
,或关联数组的
映射
的功能


有什么建议吗?

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

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


我建议解决这个问题的最好方法是让脚本引擎的包装器提供一个getValue(字符串名称),并让它修复javascript数组,将它们转换为java列表。当然,setValue(字符串、对象)将检查该值是否为列表,并将其转换回js数组,以此类推。它很单调:()

将其转换为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;
}

您是否查阅了Rhino关于如何访问Java对象的文档?是的,但它更关注如何从Javascript访问Java对象。我想做的恰恰相反:从Java访问Javascript对象。还有一点让人困惑,因为我实际上并没有使用Rhino的js.jar,我使用的是SE6发行版中的javax.script类,所以我不知道如何将sun.org.mozilla.*引入到我的构建路径中,甚至不知道我是否应该这样做。请参阅Java数组到JavaScript数组模式:但如果我是从JavaScript内部实现的话。(这是映射而不是数组)关键是,我有一些用户使用我的应用程序执行Javascript。作为Java应用程序程序员,我不知道脚本产生了什么值,但我需要能够从Java内部分析和/或操作该值。如果是数组,我可能需要得到数组长度和元素。我不能只告诉我的用户“不要使用Javascript数组,你必须使用java.lang.reflect.array.newInstance创建数组,你必须使用这种奇怪的语法。”他们会看着我,好像我有两个脑袋一样。