我想提供我自己的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
答案 0 :(得分:2)
我认为我们应该自动包装这些。在此期间,您可以将这些内部对象自己传递给delete [] arr;
以获取jdk.nashorn.api.scripting.ScriptUtils.wrap(Object)
。如果你传递了已经包装的东西,这种方法是幂等的,所以如果我们修复包装,这个解决方案不会中断。
答案 1 :(得分:2)
我已经提交了一个针对JDK https://bugs.openjdk.java.net/browse/JDK-8137258的错误来自动处理包装。同时,请使用Attila Szegedi建议的解决方法。