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 の一部になったので、Rhino API の代わりにスクリプト 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 に答える