1

我一直在使用 rhino 来允许定制一些应用程序。下面是一个从 Java 调用的 JavaScript 函数示例:

        function() {
            var phone = this.telephoneNumber;
            phone = phone.replace(/[^+0-9]/g,"");
            if (phone.indexOf("+") == 0) {
                phone = "00" + phone.substring(1);
            }
            if (phone.indexOf("0041") == 0) {
                phone = "0" + phone.substring(4);
            }
            if (phone.indexOf("0") == 0) {
                phone = "0" + phone;
            }
            return {
                Name: this.sn + " " + this.givenName,
                firstName: this.givenName || "",
                lastName: this.sn || "",
                phone: phone,
                service: "",
                info: ""
            };
        }

然后,Java 应用程序可以获取返回对象的值以执行它需要执行的任何操作。

现在 rhino 是 JVM 的一部分,我想使用脚本 API 而不是 Rhino API,但我还没有找到如何从 Java 代码中获取 JavaScript 对象的字段值。

4

1 回答 1

1

这松散地耦合了脚本语言,但需要注意的是函数需要命名,并且返回的对象需要是一个 Map(Rhino 这样做,但我不确定 JRuby)。

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    engine.eval("function x() { return { foo: 10 } }");

    Object o = ((Invocable)engine).invokeFunction("x");
    if (o instanceof Map) {
    Map m = (Map<Object, Object>)o;
        System.out.println(m.get("foo"));
    }

或者

    CompiledScript script = ((Compilable)engine).compile("(function() { return {bar:20} })()");
    System.err.println(((Map)script.eval()).get("bar"));

但是你必须作弊并通过填充来调用你的函数(...)()

于 2014-05-26T07:32:47.000 回答