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

Rhino API - Access js method using org.mozilla.javascript.Context?

本文关键字:Context 访问 js 方法 javascript mozilla API- 使用 org Rhino      更新时间:2023-09-26

如何访问此脚本中的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函数得到返回结果:

它对我有效:

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();
}