【问题标题】:set method on host object在主机对象上设置方法
【发布时间】:2019-01-27 13:50:28
【问题描述】:
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())。

【问题讨论】:

  • 你确定"this" 不是Java 中的保留变量名吗?
  • @Robert 这很特别,是的。那么如何设置全局this呢?

标签: java java-11 graalvm


【解决方案1】:

这里有两个问题:

  1. putMember("this", new Thing())不会修改全局 this,而是在全局对象中放置一个名为 this 的属性,可通过 this.this 访问。 恐怕“我如何设置全局 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();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2015-10-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2011-10-20
相关资源
最近更新 更多