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

How to avoid internal Nashorn classes in implementations of JSObject

我想提供我自己的 JSObject 实现,如下所述:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions JSObject 在 jdk.nashorn.api 包中。不幸的是,您在 api 方法中获得的对象的 类 不是。您将获得 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

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

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