GraalVm - сложный объект Java не может быть проанализирован как объект JavaScript - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь перейти с 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 В этом примере я хочу вызвать объект как:

print (param ["2"] [0] ["1"]);

и он печатает меня 3.

Что я пробовал:
попытался проанализировать каждый элемент outerMap как ProxyObject / ProxyArray.

Что работало Если вы изменилинапример, javascript:

print (param ["2"] [0] .get ("1"));

будет напечатано 3;

1 Ответ

0 голосов
/ 20 декабря 2018

В настоящее время (декабрь 2018 г.) использование [] для доступа к значениям карты Java не поддерживается. Вам нужно преобразовать карты в ProxyObject, чтобы [] заработал.Как вы сделали с mapOuter объектом.

В противном случае это обычная карта Java, на которой вы вызываете .get(key) для получения значения.

...