Nashorn в Java 11 ведет себя иначе, чем Java 8 при оценке именованных функций - PullRequest
11 голосов
/ 21 июня 2020

У меня есть приложение Java, которое позволяет пользователям манипулировать определенными объектами во время выполнения, определяя функцию JavaScript. В настоящее время мы делаем это с Nashorn в Java 8, но мы планируем перейти на Java 11. Как только мы перейдем на Java 11, мы сможем предложить эту функцию в GraalVM, но пока нам необходимо поддерживать совместимость для Java 8 -> Java 11 обновлений сценариев Нэшорна.

В Java 11 поведение Нэшорна, когда мы оцениваем функцию, по-видимому, отличается в зависимости от того, функция названа, чего не было в Java 8. Вот пример использования J JS в Java 11:

$ jjs -v
nashorn 11.0.6
Warning: The jjs tool is planned to be removed from a future JDK release
jjs> function foo() {}
jjs> function () {}
function () {}

Обратите внимание, что первое определение функции ничего не возвращает. В Java 8 он возвращает функцию, даже если функция названа:

$ jjs -v
nashorn 1.8.0_252
jjs> function foo() {}
function foo() {}

В настоящее время мы вызываем эти сценарии через:

CompiledScript compiled = scriptEngine.compile(userProvidedScript);
Object evaled = compiled.eval(bindings);
scriptEngine.invokeMethod(evaled, "call", evaled, ... input parameters ...)

Любопытно, знает ли кто-нибудь root причина этого и какие-либо хорошие обходные пути? Мне нужно поддерживать function(...), а также function foo(...) по причинам обратной совместимости. Поскольку это делается внутри нашего приложения Java, мы потенциально можем каким-то образом обернуть предоставленный пользователем скрипт или попытаться извлечь скрипт из привязок (что кажется подверженным ошибкам, поскольку может быть определено несколько скриптов, а Java 8 поведение будет для последнего заданного сценария, который будет вызван).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...