使用graal.js通过Java访问JavaScript数组

使用graal.js通过Java访问JavaScript数组,java,graalvm,graaljs,Java,Graalvm,Graaljs,我正在将一个项目从Nashorn迁移到graal.js。该项目使用了大量脚本(超过3400个),Java端有一个调用方法的函数;该方法返回对象的JavaScript列表 函数过滤器列表(ob) { var列表=[]; var arr=ob.toArray(); 对于(变量i=0;i

我正在将一个项目从Nashorn迁移到graal.js。该项目使用了大量脚本(超过3400个),Java端有一个调用方法的函数;该方法返回对象的JavaScript列表

函数过滤器列表(ob)
{
var列表=[];
var arr=ob.toArray();
对于(变量i=0;i
这在之前使用ScriptUtils的Nashorn上运行良好。这段代码是由在我开始之前参与项目的开发人员编写的:

试试看{
对象p=iv.invokeFunction(“filterList”,this.getList());
如果(p!=null){
List lObj=newarraylist(((Map)(ScriptUtils.convert(p,Map.class)).values());
返回lObj;
}
}catch(ScriptException | NoSuchMethodException ex){
例如printStackTrace();
}
如何通过Java和graal.js访问阵列?我尝试过使用
Value.asValue(p)as(MyObj[])
但没有效果。我还尝试过遵循Nashorn迁移指南,他们建议将对象强制转换为List或Map,但也没有效果


我知道有一种解决方案,我必须重写脚本,只使用
newjava.type('Java.util.ArrayList')并返回一个
列表,而不是一个数组-但是有数千个脚本,重写所有脚本将非常繁琐。

您可以使用Value.getArraySize()和Value.getArrayElement(索引):

Context=Context.newBuilder(“js”).build();
Value result=context.eval(“js”,“var list=[1,2,'foo',true];list;”;
if(result.hasArrayElements()){
对于(int i=0;i
Context context = Context.newBuilder("js").build();
Value result = context.eval("js", "var list=[1,2,'foo',true]; list;");
if (result.hasArrayElements()) {
    for (int i=0;i<result.getArraySize();i++) {
        System.out.println(result.getArrayElement(i));
    }
}