在宿主对象上设置方法

set method on host object

public class Thing {
  public Thing() {
  }

  public void run() {
  }

  public void out(String s) {
    System.out.println(s);
  }
}

Context context = Context.create("js");
Value jsBindings = context.getBindings("js");

jsBindings.putMember("this", new Thing());
context.eval("js", "this.run = () => this.out('hi');");
jsBindings.getMember("this").getMember("run").execute();

context.close();

我期待输出 hi 但我没有得到输出。

我想知道 javascript(context.eval 部分)是否没有更新我提供给它的主机对象(new Thing())。

这里有两个问题:

  1. putMember("this", new Thing()) 修改全局 this,而是放置一个名为 this 的 属性在全局对象中,可通过 this.this 访问。 "how do I set the global this" 的答案恐怕是:你不能。

  2. 分配给主机(即 Java)对象方法是不可能的。但是,您可以使用 JS 对象实现 Java 接口,使用 Value.as(Class),例如您可以执行以下操作:

public interface Thing {
  void run();
}
Context context = Context.create("js");
Value jsobj = context.eval("js", "({run: () => console.log('hi')})");
Thing javaobj = jsobj.as(Thing.class);
javaobj.run();