GraalVm - сложный объект Java не может быть проанализирован как объект JavaScript
Я пытаюсь перейти с nashorn на graalvm (Java 11). У меня много сценариев Java.
Описание -> Подключение к проекту Java с использованием maven libs org.graalvm.js: graal-sdk, js, js-scriptengine, org.graalvm.truffle: truffle-api. Версия 1.0.0-rc9.
ScriptEngine создан как 'new ScriptEngineManager(). GetEngineByName("graal.js")';
Затем вы можете создать карту в массиве в карте, как:
Map mapOuter = new HashMap();
Map mapInner = new HashMap();
List arrayInner = new ArrayList();
mapInner.put("1", 3);
arrayInner.add(mapInner);
mapOuter.put("2", arrayInner);
Затем преобразуйте mapOuter в ProxyObject, как ProxyObject.fromMap(mapOuter);
Оцените тестовый JavaScript с помощью кода:
function test(param) {
print(param["2"]);
param["2"].forEach(function(inArray){
print(inArray);
});
}
Который вызовет ошибку как:
javax.script.ScriptException: org.graalvm.polyglot.PolyglotException: TypeError: сбой INVOKE для чужого объекта из-за: Сообщение не поддерживается: INVOKE
Итак, вопрос: как заставить graalvm правильно передать сложный объект Java в функцию JavaScript?
PS Что я хочу в этом примере, чтобы вызвать объект, как:
печать (пары ["2"][0]["1"]);
и это печатает меня 3.
Что я попробовал:
попытался проанализировать каждый элемент outerMap как ProxyObject/ProxyArray.
Что сработало, если вы измените JavaScript следующим образом:
печать (пары ["2"][0].get("1"));
он будет печатать 3;
1 ответ
В настоящее время (декабрь 2018) используется []
Доступ к значениям Java-карты не поддерживается. Вам необходимо преобразовать карты в ProxyObject
делать []
Работа. Как вы сделали с mapOuter
объект.
В противном случае это обычная карта Java, на которой вы вызываете .get(key)
чтобы получить значение.