Как вызвать обратный вызов Nashorns ScriptFunction из Java?

У меня есть код javascript, который выполняется на моем объекте в Java Nashorn:

scriptEngine.eval("my.fn(function(a,b) {...}");

Я могу создать метод fn в своем классе, который получает ScriptFunction, но я не понимаю, как передавать аргументы и вызывать эту функцию из Java.

РЕДАКТИРОВАТЬ

Я могу сделать fn(Runnable) или fn(Callable), но я все еще не знаю, как передать аргументы любому из этих двух из моей Java-реализации fn?


person igr    schedule 09.08.2016    source источник


Ответы (1)


Пожалуйста, избегайте использования каких-либо внутренних типов nashorn, таких как jdk.nashorn.internal.runtime.ScriptFunction, в вашем коде Java. С jdk9 модульные проверки доступа jigsaw предотвращают доступ к таким типам из пользовательского кода!

Если вы хотите, чтобы обратный вызов передавался вашему Java-коду, который реализован в сценарии Nashorn, есть два подхода:

1) Примите любой тип @FunctionalInterface в своем коде (https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html), например Supplier, Consumer, Function и т. д. Nashorn позволяет любой функции сценария передаваться в качестве аргумента, когда в Java-коде требуется объект функционального интерфейса. Из сценария вы можете передать функцию сценария. На стороне Java вы вызываете просто как метод интерфейса (например, «получить», «принять», «применить» и т. Д. - это функциональные методы для Supplier, Consumer, Function соответственно)

2) Принять jdk.nashorn.api.scripting.JSObject (https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html) введите аргумент в коде Java. Из сценария вы можете передать функцию сценария в качестве аргумента, когда JSObject требуется в вызове Java. Из кода Java вы можете вызвать метод "call" для JSObject [https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...-]

person A. Sundararajan    schedule 09.08.2016
comment
И что происходит, когда в вашем Java-коде есть перегрузка типа public Promise then (Consumer onFulfilled, Consumer onRejected), а также public Promise then (Function onFulfilled, Function onRejected) ... java.lang.NoSuchMethodException: Can't unambiguously select between fixed arity signatures добавлена ​​дополнительная перегрузка для then (JSObject ... та же ошибка. В любом случае, чтобы сохранить перегрузки и по умолчанию использовать резервный вариант? Имеется перегрузка ScriptFunction не устраняет ошибку, к вашему сведению - person xer21; 14.11.2016