Passe facilmente matrizes e listas de e para Nashorn

Eu sei que você pode trabalhar com matrizes Java em Nashorn e há muitos exemplos de como fazer isso. O problema para mim com a abordagem padrão é que ele torna o código javascript explicitamente ciente de seu ambiente de tempo de execução. Atualmente, tenho uma solução que utiliza o Rhino e converte perfeitamente entre os tipos Java e JavaScript nativo.

Para o Rhino, consegui isso implementandoorg.mozilla.javascript.ContextFactory eorg.mozilla.javascript.WrapFActory e configuraçãoWrapFactory noContext quandomakeContext é chamado. Essa implementação do WrapFactory cuida da conversão entre matrizes e listas Java e matrizes e listas javascript nativas. Também é difícil mencionar que eu precisei obter o código-fonte Rhino do JDK para que essa abordagem funcionasse.

Preciso encontrar uma solução semelhante para Nashorn. Aqui está um exemplo do que estou tentando realizar.

public static void main(String args[]) {
    NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
    ScriptEngine engine = factory.getScriptEngine();
    try {
        engine.eval("function print_array(arr) { print(arr); }");
        engine.eval("function print_native() { print_array([1, 2, 3, 4]); }");
        Invocable invocable = (Invocable) engine;
        invocable.invokeFunction("print_array", new int[]{1, 2, 3, 4});
        invocable.invokeFunction("print_array", Arrays.asList(1, 2, 3, 4));
        invocable.invokeFunction("print_native");
    } catch (ScriptException | NoSuchMethodException e) {
        e.printStackTrace();
    }
}

A saída deste código é

[I @ 169e6180

[1, 2, 3, 4]

1,2,3,4

Estou procurando uma maneira de implementar um ScriptObjectMirror, supondo que isso esteja correto, que faria a saída desses trêsinvokeFunction as chamadas são iguais.

Eu tentei usarwrap função ativadaScriptUtils, mas ainda assim o resultado está errado

ATUALIZAR

Eu tentei criar um proxy dinâmico do tipoInvocable e faça conversões noInvocationHandler. Para criar um NativeArray com Nashorn, parece que você deve usarjdk.nashorn.internal.objects.Global.allocate, mas isso sempre gera uma exceção.

Global.allocate(new int[] {1, 2, 3, 4})

Levanta

Exception in thread "main" java.lang.NullPointerException
    at jdk.nashorn.internal.objects.Global.instance(Global.java:491)
    at jdk.nashorn.internal.objects.NativeArray.<init>(NativeArray.java:141)
    at jdk.nashorn.internal.objects.Global.allocate(Global.java:1584)

questionAnswers(1)

yourAnswerToTheQuestion