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)