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个赞
这里有两个问题:
putMember("this", new Thing())
不会修改全局,而是this
在全局对象中放置一个名为的属性this
,可以通过this.this
. 恐怕“我如何设置全局 this”的答案是:你不能。分配给宿主(即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();
添加回答
举报
0/150
提交
取消