Установить метод на хост-объект
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 ответ
Решение
Здесь есть две проблемы:
putMember("this", new Thing())
не будет изменять глобальныйthis
, но поместите свойство с именемthis
в глобальном объекте, доступном черезthis.this
, И ответ на вопрос "как мне установить глобальное это", боюсь, вы не можете.Присвоение объектным (т.е. 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();