Java 主机对象上的set方法

Java 主机对象上的set方法,java,java-11,graalvm,Java,Java 11,Graalvm,我期待输出hi,但我没有得到输出 我想知道javascript(context.eval部分)是否没有更新我提供的主机对象(newthing()) putMember(“this”,new Thing())不会修改全局this,而是将名为this的属性放在全局对象中,可通过this访问。this。 “我该如何设置全球范围”的答案恐怕是:你不能 无法将对象方法分配给主机(即Java)。但是,您可以使用JS对象实现Java接口,例如,您可以执行以下操作: 公共接口的东西{ 无效运行(); } Con

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


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

  • putMember(“this”,new Thing())
    不会修改全局
    this
    ,而是将名为
    this
    的属性放在全局对象中,可通过
    this访问。this
    。 “我该如何设置全球范围”的答案恐怕是:你不能

  • 无法将对象方法分配给主机(即Java)。但是,您可以使用JS对象实现Java接口,例如,您可以执行以下操作:

  • 公共接口的东西{
    无效运行();
    }
    Context=Context.create(“js”);
    值jsobj=context.eval(“js”,即“({run:()=>console.log('hi')}”);
    Thing javaobj=jsobj.as(Thing.class);
    javaobj.run();
    
    这里有两个问题:

  • putMember(“this”,new Thing())
    不会修改全局
    this
    ,而是将名为
    this
    的属性放在全局对象中,可通过
    this访问。this
    。 “我该如何设置全球范围”的答案恐怕是:你不能

  • 无法将对象方法分配给主机(即Java)。但是,您可以使用JS对象实现Java接口,例如,您可以执行以下操作:

  • 公共接口的东西{
    无效运行();
    }
    Context=Context.create(“js”);
    值jsobj=context.eval(“js”,即“({run:()=>console.log('hi')}”);
    Thing javaobj=jsobj.as(Thing.class);
    javaobj.run();
    
    你确定
    “this”
    不是Java中的保留变量名吗?@Robert它很特别是的。那么如何设置全局
    this
    呢?你确定
    this“
    不像Java中那样是一个保留变量名吗?@Robert它很特别是的。那么如何设置全局
    this
    呢?您知道如何对抽象类而不是接口进行同样的设置吗?您知道如何对抽象类而不是接口执行同样的操作吗?
    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();