Установить метод на хост-объект

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 но я не получаю выходной.

Интересно, если JavaScriptcontext.eval раздел) не обновляет хост-объект (new Thing()), что я предоставляю это.

1 ответ

Решение

Здесь есть две проблемы:

  1. putMember("this", new Thing()) не будет изменять глобальный this, но поместите свойство с именем this в глобальном объекте, доступном через this.this, И ответ на вопрос "как мне установить глобальное это", боюсь, вы не можете.

  2. Присвоение объектным (т.е. Java) объектным методам невозможно. Однако вы можете реализовать интерфейс Java, используя объект JS, используя 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();
Другие вопросы по тегам