Java中的Graal嵌入式javascript,如何从Java调用列表/数组上的map?可能吗?

丹尼·G:

我正在与Graal一起玩,以将javascript作为来宾语言运行,并且想知道是否Array.map可以在主机(Java)对象或代理上使用javascript 功能。Demo Kotlin代码紧随其后,但应与Java代码足够接近。

fun main() {
    val context = Context.newBuilder().build()
    val javaOutputList = mutableListOf<Integer>()
    val javaList = listOf(2, 2, 3, 4, 5)
    val proxyJavaList = ProxyArray.fromList(javaList)

    context.polyglotBindings.apply {
        putMember("javaOutputList", javaOutputList)
        putMember("javaList", javaList)
        putMember("proxyJavaList", proxyJavaList)
    }

    val script = """
        var javaOutputList = Polyglot.import('javaOutputList');
        var javaList = Polyglot.import('javaList');
        var proxyJavaList = Polyglot.import('proxyJavaList');

        var abc = [1, 2, 3];
        abc.forEach(x => javaOutputList.add(x));      // WORKS

        //abc.map(x => x + 1)             // WORKS
        //javaList.map(x => x + 1)        // DOES NOT WORK (map not a method on list)
        proxyJavaList.map(x => x + 1)     // DOES NOT WORK (message not supported: INVOKE)
    """.trimIndent()

    val result = context.eval("js", script)

    val resultList = result.`as`(List::class.java)
    println("result: $resultList")
    println("javaOutputList: $javaOutputList")

}

使用ProxyArray对我来说似乎是最有前途的,但我仍然无法使它正常工作。是否希望支持此功能?

编辑:代码已被接受,答案是有效的,这是有兴趣的更改:

    val context = Context.newBuilder()
            //.allowExperimentalOptions(true)  // doesn't seem to be needed
            .option("js.experimental-foreign-object-prototype", "true")
            .build()
扬·斯托拉:

问题的根源在于Array.prototype,默认情况下,类似数组的非JavaScript对象不在其原型链上。因此,Array.prototype.map无法使用javaList.map/ proxyJavaList.map语法进行访问

您可以Array.prototype.map直接调用Array.prototype.map.call(javaList, x => x+1),也可以使用实验选项js.experimental-foreign-object-prototype=true(我们最近添加),该选项添加Array.prototype到所有类似数组的对象的原型链上。javaList.map/ proxyJavaList.map将可用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在MongoDB中搜索嵌入式数组(使用Java)

如何在嵌入式数组mongodb中查询嵌入式文档

了解JavaScript中的嵌入式ActiveRecord调用,Ruby on Rails

如何从命令行调用嵌入式jre以便运行Java应用程序

如何在jQuery中调用嵌入式函数?

使用Java在MongoDB中的嵌入式文档中索引和搜索“数组”

您可以在Java嵌入式代理中以编程方式更改队列的“死信”处理吗?

Java用Jackson读取JSON-嵌入式数组

Java邮件轮询从邮件中读取嵌入式或嵌入式图像(笑脸)

如何使用$ .each在JSON中显示嵌入式数组?

球衣的嵌入式tomcat上的java.net.SocketTimeoutException

在文档中引用文档的嵌入式数组的嵌入式数组上查询Doctrine2和MongoDB

从C ++应用程序中的嵌入式Python调用时,Numpy导入在多数组扩展库上失败

如何修复嵌入式字体(Java)的FileNotFoundException?

查询OrientDB中的嵌入式列表

遍历嵌入式Elixir中的列表

Java RequestDispatcher在Jetty嵌入式应用中返回null

Java Web应用程序中的嵌入式Derby

使用Java在Excel中读取嵌入式pdf文件

如何查询Mongodb的嵌入式数组

如何使用HTML中的嵌入式Java应用程序进行本地文件系统访问

如何删除Java字符串中的嵌入式花括号?

您如何在Java Webapps中管理嵌入式配置文件和库?

“数组列表”和“链接列表”的好处...在Java中可能吗?

嵌入式AMQP Java代理

WGET-如何从文本文件URL列表中下载具有下载按钮的嵌入式pdf?可能吗?

在嵌入式窗体上两次调用FormShow

如何将数组指向嵌入式系统上的某些特定内存地址

如何计算按嵌入式列表分组的列表项