22

假设我有一个 Javascript 文件

function js_main(args){
     /* some code */
     var x = api_method1(some_argument);
     /* some code */
}

我尝试用javax.scripting通常的方式运行它

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval(...);

现在我想api_method1用我的 Java 类处理对 Javascript 的调用。我想要某种映射/绑定调用,即每次脚本调用api_method1(arg)方法时

public Object api_method1(Object arg){ ... }

(与引擎放在同一类中)将被调用。

我能做到这一点吗?

4

1 回答 1

15
  1. 用于engine.createBindings()制作 Bindings 对象;
  2. 将一个对象暴露您的方法放入具有某个名称的绑定中:

    Bindings b = engine.createBindings();
    b.put("api", yourApiObject);
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE);
    
  3. 然后在 JavaScript 中会有一个可以调用的全局“api”对象:

    api.method1( "foo", 14, "whatever" );
    

该设施易于使用,但要小心您来回传递的内容;将 JavaScript 类型转换为 Java 类型并没有多大作用。

于 2012-06-20T19:00:39.297 回答