Один из рекомендуемых способов написания модулей javascript выглядит следующим образом:
var engine = (function() {
// private stuff goes here...
function composeGreeting() {return 'Hello';};
return {
composeGreeting: composeGreeting
} // return
})();
Однако, если вы оцениваете вышеуказанный файл с помощью nashorn, я не могу найти способ вызвать "composeGreeting"
Файл оценивается так:
File file = new File("my.js")
Reader reader = file.newReader();
engine.eval(reader)
Invocable invocable = (Invocable) engine;
Я пытался вызвать функцию следующим образом:
Object funcResult = invocable.invokeFunction("engine.composeGreeting");
Но это не работает.
Я также взялудар в темноте и попытался это:
funcResult = invocable.invokeMethod(engine.get("engine"), "composeGreeting");
Однако, это дает ошибку "java.lang.NoSuchMethodException"
Пробовал также (не работает)
funcResult = invocable.invokeFunction("engine").invokeFunction("composeGreeting");
Пробовал также (renderServer имеет значение null)
ScriptObjectMirror renderServer = (ScriptObjectMirror) scriptEngine.get("engine");
funcResult = renderServer.call ("composeGreeting");
Есть предложения? Документация гласит, что get просто возвращает объект - нет никакого упоминания о том, что это за объект на самом деле или как его использовать.
Очевидно, если мой файл js только что имел это:
function composeGreeting() {return 'Hello';};
и ничего более, я могу с радостью назвать это так:
Object funcResult = invocable.invokeFunction("composeGreeting");
Но это разоблачит все личные внутренние архивы моего файла js.
Если честно, я не знаю, чтотип «движка» будет.
Примечание: мы не можем использовать graalVM, так как в настоящее время graalVM поддерживает только Java 8 из коробки, и примеров для GraalVM еще меньше, чем nashorn.
Этот пост подсказывает, что это возможно, но не включает решение: Nashorn: вызов функции внутри пространства имен