Настройка Callable для объекта Java из скрипта Nashorn

У меня есть экземпляр класса, в котором есть поле Callable. Я установил этот экземпляр на объект Bindings. Мне нужно установить поле Callable из Nashorn, чтобы оно вызывалось в Java. Как мне установить это поле из скрипта Nashorn?

Скрипт называется так:

//in java
class Options {
    Callable<Boolean> handler;
}
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = engine.createBindings();
Options options = new Options();
bindings.put("options", options);
engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
engine.eval(script);
Invocable executor = (Invocable) engine;
executor.invokeFunction("init");

А в скрипте мне нужно установить поле handler на глобальный объект Options:

//in nashorn
function init() {
    //How would I set a Callable on this field, from within nashorn?
    options.handler = ?
}

Я видел (предлагаемый дубликат) вопрос Как использовать движок Nashorn для вызова объектов Java, но этот вопрос касается вызова метода Java из сценария Nashorn, тогда как этот вопрос касается установки вызываемого объекта внутри сценария Nashorn, который затем может быть вызван из Java (в основном наоборот).


person Werlious    schedule 14.12.2020    source источник
comment
О вашем актуальном вопросе: я не знаю ответа (и не имею опыта работы с насорном). Кажется, вы хотите вызвать некоторую логику внутри скрипта nashorn из java. Разве нельзя определить нормальную функцию в скрипте и вызывать ее так же, как вызывается функция 'init'?   -  person Reto Höhener    schedule 16.12.2020
comment
На самом деле, единственное, что здесь нужно сделать nashorn, это установить handler, что я думал будет так же просто, как установить лямбду, как в java, но это не сработало. На самом деле я не контролирую, как вызывается скрипт, и я мало знаю, что происходит в Java. Мне нужно написать сценарий nashorn, который просто устанавливает обработчики объектов в функции init и вызывается в другом месте в java. Все, что мне было дано, это то, что Options будет установлено глобально, и для поля handler потребуется установить вызываемое.   -  person Werlious    schedule 16.12.2020
comment
Раньше я устанавливал его с помощью предварительно созданных вызываемых объектов из классов на стороне Java, таких как Options.handler = Java.type('com.example.Handlers').SomeCallable, но теперь мне нужно определить вызываемые объекты из nashorn.   -  person Werlious    schedule 16.12.2020


Ответы (1)


На основе раздела «Расширение классов» в этом руководстве по nashorn. Проверено, у меня сработало:

   var Callable = Java.type('java.util.concurrent.Callable');
   var CallableImpl = Java.extend(Callable, {
     call: function() {
       print('test');
     }
   });
   
   options.handler = new CallableImpl();
person Reto Höhener    schedule 17.12.2020
comment
Чистое золото. Спасибо за этот и тот урок, я буду проверять его. Еще раз спасибо за помощь в решении этого вопроса - person Werlious; 17.12.2020
comment
Рад слышать, было весело! В первый раз мне тоже удалось снова открыть вопрос;) - person Reto Höhener; 17.12.2020
comment
Что ж, это очень ценно :) - person Werlious; 17.12.2020