为了账号安全,请及时绑定邮箱和手机立即绑定

在主机对象上设置方法

在主机对象上设置方法

万千封印 2022-05-25 09:47:41
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 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

这里有两个问题:

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


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信