gpt4 book ai didi

Java Nashorn 引擎 ArrayNode 处理

转载 作者:行者123 更新时间:2023-12-02 02:11:50 27 4
gpt4 key购买 nike

我使用Java Nashorn 引擎来执行Javascript 代码。我使用 ScriptEngine 对象eval 方法,该方法有第二个参数用于“绑定(bind)”。我用它来将变量传递给引擎。它与对象类型和原始包装类一起工作得很好,但是当我尝试传递 ArrayNode 时,它​​不能作为 JavaScript 数组工作,我不知道为什么。

示例代码:

String scriptText = "myarray[1] = 666";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = engine.createBindings();
ArrayNode arrayNode = mapper.createArrayNode();
array.add(1);
array.add(2);
array.add(3);

bindings.put("myarray", arrayNode);
engine.eval(scriptText, bindings);

这应该会更改绑定(bind)对象中的 myarray 值,但事实并非如此。

我做错了什么?

最佳答案

Nashorn 支持类似脚本数组的索引访问/更新

  1. Java 数组对象
  2. java.util.ArrayList 对象
  3. jdk.nashorn.api.scripting.JSObject 对象

如果 ArrayNode 不是 ArrayList 子类型,您可以在 ArrayNode 类中实现 JSObject 接口(interface),或者使用 JSObject 实现包装 ArrayNode 并将其公开给脚本 ( https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html )。

演示上述三种情况的示例:

import java.util.*;
import javax.script.*;
import jdk.nashorn.api.scripting.*;

public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");

// Java array accessed by indexing
String[] arr = { "hello", "world" };
e.put("jarr", arr);
e.eval("jarr[1] = jarr[1].toUpperCase()"); // change first element
System.out.println(arr[1]); // change reflected here

// Java ArrayList accessed by indexing
ArrayList<String> alist = new ArrayList<>();
alist.add("nashorn");
alist.add("javascript");
e.put("jlist", alist);
e.eval("jlist[0] = 'Nashorn'");
System.out.println(alist.get(1)); // change reflected here

// Third case - a JSObject array-like object accessed by indexing
e.put("myObj", new AbstractJSObject() {
private Map<Integer, Object> values = new HashMap<>();
@Override
public void setSlot(int index, Object val) {
values.put(index, val);
}

@Override
public Object getSlot(int index) {
return values.get(index);
}
});

e.eval("myObj[0] = 'hello'");
e.eval("print(myObj[0])");
}
}

关于Java Nashorn 引擎 ArrayNode 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49899465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com