在宿主对象上设置方法
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()
)。
这里有两个问题:
putMember("this", new Thing())
将 不 修改全局 this
,而是放置一个名为 this
的 属性在全局对象中,可通过 this.this
访问。
"how do I set the global 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();
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()
)。
这里有两个问题:
putMember("this", new Thing())
将 不 修改全局this
,而是放置一个名为this
的 属性在全局对象中,可通过this.this
访问。 "how do I set the global 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();