Как я могу вызвать функцию дочернего свойства, используя Apache Rhino - PullRequest
4 голосов
/ 12 сентября 2011

Если у меня есть объект js, такой как ниже, сохраненный в файле js

var _sampleProcessor = {
    process: function(data){
        ...
    }

}

Как бы я использовал Apache Rhino для вызова функции процесса?

// sb holds the contents of the js file
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
cx.evaluateString(scope, sb.toString(), "Test", 1, null);

Object processor = scope.get("sampleProcessor ", scope);
if (processor  == Scriptable.NOT_FOUND) {
    System.out.println("processor  is not defined.");
}

Добраться до корня объекта легко, но как мне пройти по дереву объектов, чтобы получить свойство функции процесса

Заранее спасибо

1 Ответ

2 голосов
/ 13 сентября 2011

Этот образец делает несколько вещей. Извлекает sampleProcessor, как это делает ваш пример, а также извлекает свойство process и выполняет эту функцию.

Также показано добавление объектов Java в область видимости, чтобы их можно было использовать - объект System.out в примере.

package grimbo.test.rhino;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;

public class InvokeFunction {
    public static void main(String[] args) {
        String sb = "var sampleProcessor = {\n" + "    process: function(data){\n    out.println(0); return 1+1;\n    }\n" + "}";

        Context cx = Context.enter();
        Scriptable scope = cx.initStandardObjects();

        Object out = Context.javaToJS(System.out, scope);
        ScriptableObject.putProperty(scope, "out", out);

        cx.evaluateString(scope, sb.toString(), "Test", 1, null);

        // get the sampleProcessor object as a Scriptable
        Scriptable processor = (Scriptable) scope.get("sampleProcessor", scope);
        System.out.println(processor);

        // get the process function as a Function object
        Function processFunction = (Function) processor.get("process", processor);
        System.out.println(processFunction);

        // execute the process function
        Object ob = cx.evaluateString(scope, "sampleProcessor.process()", "Execute process", 1, null);
        System.out.println(ob);
    }
}

Выход:

[object Object]
org.mozilla.javascript.gen.Test_1@b169f8
0.0
2
...