Отражение на массивах - небольшая проблема в Java (примитивные типы и все такое прочее), поэтому у скриптовых движков JSR-223 с ними проблемы.Я пробовал тот же код с новым GraalVM, и это страдает от той же проблемы - движок разочаровывается в поиске хорошего сопоставления и просто пытается представить свое собственное представление значения массива (Nashorn использует ScriptObjectMirror
, а GraalVM использует PolyglotMap
).
Если вы хотите, чтобы ваша функция хоста выглядела так, как будто она принимает "реальный массив" (реализация гостевого массива), ваша функция хоста должна будет принять внутреннюю базовую ScriptEngine
реализации и научиться оперировать этим.Согласно этому SO-ответу и ScriptObjectMirror API документам вы должны иметь возможность использовать метод obj.to(int[].class)
для извлечения внутреннего целочисленного массива из прокси-объекта.
Основным недостатком этого подхода является то, что ваша функция хоста должна поддерживать каждое конкретное внутреннее представление каждой конкретной ScriptEngine
s, которую вы, возможно, захотите поддерживать.
Поскольку механизм Jashascript Nashorn устарел в текущих JDK, вы можете захотетьдля поддержки GraalVM, в случае чего ваша реализация может выглядеть примерно так:
private static class test implements Function<Object, Integer[]> {
@Override
public Integer[] apply(Object inp) {
int[] msg;
if (inp instanceof ScriptObjectMirror)
msg = ((ScriptObjectMirror)inp).to(int[].class);
else if (inp instanceof AbstractMap)
msg = Value.asValue(inp).as(int[].class);
else
return null;
for (int i = 0; i < msg.length; i++)
System.out.println(msg[i]);
Integer[] a = { 1, 2, 3 };
return a;
}
}