Я пытаюсь собрать базовую тестовую структуру для ряда сценариев JS, которые мне предоставили. Все они бегут на Нэшорне (JDK 11) без проблем в их первоначальной среде обитания. Я сам пытаюсь загрузить и запустить сценарии и выполнять тесты, сравнивая вход и вывод. Хотя я знаю, что их можно запустить через Nashorn, у меня нет доступа к исходному коду, который делает это, и у меня возникает проблема с получением ссылок на все необходимые мне функции/методы. Исходные файлы следуют этому шаблону: < /p>
(function () {
"use strict";
print("Canary: Here I am inside the root level function");
function writeLogEntry(message) {
echo(message);
}
return function main(data) {
print("Canary: Here I am inside main");
writeLogEntry(data.someVitalStat());
return true;
};
})();
< /code>
У меня нет возможности изменить исходные файлы - я должен использовать их как есть. Проблема заключалась в том, чтобы получить ссылку на функции, отличные от Main. Я смог получить рефери для Main следующим образом, что потребовало двух проходов: < /p>
String scriptTextRaw = new String(Files.readAllBytes(Paths.get(location)), StandardCharsets.UTF_8);
var ee = new ScriptEngineManager().getEngineByName("Nashorn");
scriptTextRaw = "var mainfunc = " + scriptTextRaw;
ee.eval(scriptTextRaw);
Object mainRef = ee.get("mainfunc");
// Second eval pass
ee.eval(mainRef.toString());
var mainInvocable = (ScriptObjectMirror)ee.get("main");
// Invoke main function
Object mainResult = mainInvocable.call(myDataObject);
< /code>
Я открыт для лучших способов получить эту основную ссылку. Тем не менее, большая проблема заключается в том, что анонимные функции, инкапсулированные в сценарии, недоступны. Запуск приведенного выше кода, я получаю: < /p>
Exception in thread "main" :3 ReferenceError: "writeLogEntry" is not defined.
< /code>
Я пробовал несколько вещей, например ,::
Object writeLogEntryRef = (ScriptObjectMirror)ee.get("writeLogEntry");
< /code>
(как после первого, так и второго прохода Eval) < /p>
Но это безуспешно. Я также остановил программу в отладчике после каждого прохода Eval для изучения возвращенного объекта, но я не нахожу никаких ссылок на другие методы. Расположение и запуск сценария, отформатированный как этот? Весь вход ценится.
Подробнее здесь: https://stackoverflow.com/questions/794 ... bfunctions
Nashorn: выполнить скрипт с анонимной функцией уровня корня и подфункциями ⇐ Javascript
Форум по Javascript
1740000022
Anonymous
Я пытаюсь собрать базовую тестовую структуру для ряда сценариев JS, которые мне предоставили. Все они бегут на Нэшорне (JDK 11) без проблем в их первоначальной среде обитания. Я сам пытаюсь загрузить и запустить сценарии и выполнять тесты, сравнивая вход и вывод. Хотя я знаю, что их можно запустить через Nashorn, у меня нет доступа к исходному коду, который делает это, и у меня возникает проблема с получением ссылок на все необходимые мне функции/методы. Исходные файлы следуют этому шаблону: < /p>
(function () {
"use strict";
print("Canary: Here I am inside the root level function");
function writeLogEntry(message) {
echo(message);
}
return function main(data) {
print("Canary: Here I am inside main");
writeLogEntry(data.someVitalStat());
return true;
};
})();
< /code>
У меня нет возможности изменить исходные файлы - я должен использовать их как есть. Проблема заключалась в том, чтобы получить ссылку на функции, отличные от Main. Я смог получить рефери для Main следующим образом, что потребовало двух проходов: < /p>
String scriptTextRaw = new String(Files.readAllBytes(Paths.get(location)), StandardCharsets.UTF_8);
var ee = new ScriptEngineManager().getEngineByName("Nashorn");
scriptTextRaw = "var mainfunc = " + scriptTextRaw;
ee.eval(scriptTextRaw);
Object mainRef = ee.get("mainfunc");
// Second eval pass
ee.eval(mainRef.toString());
var mainInvocable = (ScriptObjectMirror)ee.get("main");
// Invoke main function
Object mainResult = mainInvocable.call(myDataObject);
< /code>
Я открыт для лучших способов получить эту основную ссылку. Тем не менее, большая проблема заключается в том, что анонимные функции, инкапсулированные в сценарии, недоступны. Запуск приведенного выше кода, я получаю: < /p>
Exception in thread "main" :3 ReferenceError: "writeLogEntry" is not defined.
< /code>
Я пробовал несколько вещей, например ,::
Object writeLogEntryRef = (ScriptObjectMirror)ee.get("writeLogEntry");
< /code>
(как после первого, так и второго прохода Eval) < /p>
Но это безуспешно. Я также остановил программу в отладчике после каждого прохода Eval для изучения возвращенного объекта, но я не нахожу никаких ссылок на другие методы. Расположение и запуск сценария, отформатированный как этот? Весь вход ценится.
Подробнее здесь: [url]https://stackoverflow.com/questions/79452724/nashorn-execute-script-with-anonymous-root-level-function-and-subfunctions[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия