установить метод на хост-объект - PullRequest
0 голосов
/ 27 января 2019
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 Ответ

0 голосов
/ 28 января 2019

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

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