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

Java 如何在JSObject实现中避免内部Nashorn类,java,java-8,nashorn,Java,Java 8,Nashorn,我想提供我自己的JSObject实现,如下所述: JSObject位于jdk.nashorn.api包中。不幸的是,在api方法中得到的对象类不是。您将获得NativeArray和JO4,它们都是内部包的一部分。我的问题是,我应该如何处理这些对象?是否建议使用内部功能?或者可以将这些对象强制转换为api包中的任何对象吗 以下是我的简单示例: import javax.script.Invocable; import javax.script.ScriptEngine; import javax.

我想提供我自己的JSObject实现,如下所述: JSObject位于jdk.nashorn.api包中。不幸的是,在api方法中得到的对象类不是。您将获得NativeArray和JO4,它们都是内部包的一部分。我的问题是,我应该如何处理这些对象?是否建议使用内部功能?或者可以将这些对象强制转换为api包中的任何对象吗

以下是我的简单示例:

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

我想我们应该为您自动包装这些。同时,您可以自己将这些内部对象传递给jdk.nashorn.api.scripting.ScriptUtils.wrapObject以获取JSObject。如果您将已包装的内容传递给它,则此方法是幂等的,因此如果我们修复包装,此解决方案将不会中断。

我已针对JDK提交了一个bug,以自动处理包装。同时,请使用Attila Szegedi建议的解决方法。

1。通常,内部引擎返回从合同中的类派生的对象,这是正常的,可以转换为基本类。免责声明:我不知道这是Yoyr的案例,即J04源自JSObject2。我现在不知道如何有效地将您的类插入引擎可能您在Groovy中设置了2in1问题类似的工作具有动态特性不幸的是内部类没有子类JSObject,也没有api中的其他类。谢谢,我将使用包装器。解决方案很好,但它同样要求我使用一个内部类:因为setMember方法带有一个对象值,但是wrap需要一个ScriptObject,所以必须显式地强制转换该值,以避免出现编译器错误。因此,我得到了jdk.nashorn.internal.runtime.ScriptObject的导入。无论如何,如果按照bug报告的建议在内部完成包装,那么一切都会很好。