如何在JSObject的实现中避免内部Nashorn类

时间:2015-09-21 08:12:04

标签: java java-8 nashorn

我想提供我自己的JSObject实现,如下所述:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions JSObject位于jdk.nashorn.api包中。不幸的是,你在api-methods中获得的对象的类不是。你得到NativeArray和JO4,它们都是内部包的一部分。我的问题是,我应该如何处理这些对象?是否建议使用内部功能?或者是否可以将这些对象转换为api-package中的任何对象?

以下是我的简单示例:

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import jdk.nashorn.api.scripting.AbstractJSObject;

public class JacksonToJSObject extends AbstractJSObject {

    final static ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

    public static void main(String[] args) throws ScriptException, NoSuchMethodException {
        String script = "var fun = function(obj) {obj.arrayField = [1,2]; obj.objField = {\"field\":\"test\"}};";
        engine.eval(script);
        ((Invocable)engine).invokeFunction("fun", new JacksonToJSObject());
    }

    @Override
    public void setMember(String name, Object value) {
        System.out.println(value.getClass().getCanonicalName());
    }

}

这是输出

jdk.nashorn.internal.objects.NativeArray
jdk.nashorn.internal.scripts.JO4

2 个答案:

答案 0 :(得分:2)

我认为我们应该自动包装这些。在此期间,您可以将这些内部对象自己传递给delete [] arr;以获取jdk.nashorn.api.scripting.ScriptUtils.wrap(Object)。如果你传递了已经包装的东西,这种方法是幂等的,所以如果我们修复包装,这个解决方案不会中断。

答案 1 :(得分:2)

我已经提交了一个针对JDK https://bugs.openjdk.java.net/browse/JDK-8137258的错误来自动处理包装。同时,请使用Attila Szegedi建议的解决方法。