Нашорн: как вызвать функцию для функции или объекта - PullRequest
0 голосов
/ 09 октября 2019

Один из рекомендуемых способов написания модулей 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: вызов функции внутри пространства имен

1 Ответ

0 голосов
/ 10 октября 2019

Я был на правильном пути. Рабочий ответ был опубликован здесь .

Суть этой строки:

funcResult = invocable.invokeMethod(scriptEngine.get("engine"), "composeGreeting");

Не уверен, почему это не сработало для меня раньше, но работает сейчас.

...