Rhino API - 使用org.mozilla.javascript.Context访问js方法?

时间:2013-09-05 08:00:55

标签: java javascript rhino javascript-engine

如何在此脚本中访问get方法:

(function( global ){

    var Result;

    (Result = function( val ) {
        this.tpl = val || '' ;
    }).prototype = {

        get: function ()
        {
            return 'text' ;
        }

    };

    global.Result = Result ;

} ( window ) ) ;

我试过这样的方式:

创建Window类和Result接口:

public interface Result{ public String get(); }

public class Window { public Result Result;   }

调用js函数:

public void call() {

    Context context = Context.enter();

    ScriptableObject scope = context.initStandardObjects();

    FileReader fileReader = new FileReader("file.js");

    Object window = Context.javaToJS(new Window(), scope);

    scope.put("window", scope, window);

    context.evaluateReader(scope, fileReader, "test", 1, null);

    context.evaluateString(scope, "Result = window.Result;", "test", 2, null);

    context.evaluateString(scope, "result = Result.get();", "test", 3, null);
    Object result = scope.get("result", scope);
    System.out.println("\n" + Context.toString(result));
    context.exit();

}

但我无法从get函数获得返回结果:

1 个答案:

答案 0 :(得分:1)

它对我有用:

public class Result extends ScriptableObject{

    @Override
    public String getClassName() {
        // TODO Auto-generated method stub
        return "Result";
    } 
}

public class Window extends ScriptableObject { 
    private Result Result;   

    public Result getResult() {
        return Result;
    }

    @Override
    public String getClassName() {
        return "Window";
    }
}

public void call() {

    Context context = Context.enter();

    ScriptableObject scope = context.initStandardObjects();

    FileReader fileReader = new FileReader("file.js");

    Window window = new Window();

    scope.put("window", scope, window);

    scope.put("window.Result", window.getResult());

    context.evaluateReader(scope, fileReader, "test", 1, null);

    context.evaluateString(scope, "Result = window.Result;", "test", 1, null);

    context.evaluateString(scope, "var myResult = new Result();", "test", 1, null);

    context.evaluateString(scope, "r = myResult.get();", "test", 1, null);
    Object result = scope.get("r", scope);
    System.out.println("\n" + Context.toString(result));
    context.exit();

}