【问题标题】:interoperation between Rhino and Java via JSR223: working with Javascript Object instancesRhino 和 Java 通过 JSR223 进行互操作:使用 Javascript 对象实例
【发布时间】:2012-02-13 06:58:03
【问题描述】:

这与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> 的能力。

有什么建议吗?

【问题讨论】:

  • 您是否查看过关于如何访问 Java 对象的 Rhino 文档? mozilla.org/rhino/ScriptingJava.html
  • 是的,但它更侧重于如何从 Javascript 访问 Java 对象。我想做的恰恰相反:从 Java 访问 Javascript 对象。这也令人困惑,因为我实际上并没有使用 Rhino 的 js.jar,我使用的是 SE 6 发行版中的 javax.script 类,所以我不知道如何让 sun.org.mozilla.* 进入我的构建路径,甚至我是否应该这样做。
  • 查看 Java 数组转 JavaScript 数组模式:mozilla.org/rhino/faq.html
  • 但那是我在 Javascript 中做的。 (它是地图而不是数组) 关键是,我有使用我的应用程序执行 Javascript 的用户。作为 Java 应用程序程序员,我不知道脚本会产生什么值,但我需要能够从 Java 中 分析和/或操作该值。如果它是一个数组,我可能需要获取数组长度和元素。我不能只告诉我的用户“不要使用 Javascript 数组,你会被这种奇怪的语法困住,你必须使用 java.lang.reflect.Array.newInstance 创建数组。”他们会看着我,就像我有两个脑袋一样。

标签: java rhino jsr223


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多