GraalVM是Oracle的一个新的开源项目,它试图使Java虚拟机成为运行所有主要语言的通用虚拟机。在GraalVM之前,已经很少有像Scala、Closure这样的语言将JVM作为其运行时。这对于这些语言来说是非常成功的。GraalVM进一步扩展了这一思想,使得以JVM为目标变得很容易,从而使更多的语言可以在JVM上共存。
GraalVM是从2014年开始的一个研究项目。推特从2017年开始就在制作中使用它。但对于普通公众来说,它在2019年下半年就已经准备好了。
在这一系列文章中,我将探讨GraalVM可以为JVM生态系统带来什么。这是本系列的第五篇文章,探讨如何将复杂对象从Scala传递到JavaScript。你可以在这里阅读本系列的所有文章
将值从Scala传递到JavaScript
在上一篇文章中,我们看到了如何在Scala程序中使用JavaScript对象。在本文中,我们将讨论如何将Scala对象传递给JavaScript。
启用允许对上下文进行访问
默认情况下,来宾语言JavaScript不能从宿主语言Scala访问任何对象。这是出于安全目的。但我们可以通过在上下文级别启用访问来覆盖这一点。
下面的代码显示了如何做到这一点:
val context = Context.newBuilder().allowAllAccess(true).build()
这里我们使用上下文的生成器模式来传递额外的参数。在上下文上使用allowAllAccess
方法,我们允许访问主机环境。
创建Scala对象
下面的代码在Scala中创建一个person
对象
case class Person(name:String, age:Int)
val person = Person("John",20)
使Scala对象可用于JavaScript
默认情况下,并非所有在Scala中创建的对象都可用于JavaScript。它需要明确提供。
context.getBindings("js").putMember("person",person)
在上面的代码中,使用putMember
方法,我们使person对象可用于JavaScript。
使用JavaScript中的Scala对象
下面的代码显示如何在JavaScript代码中访问person
对象。
val result = context.eval("js","person.name() == 'John' && person.age() == 20").asBoolean()
正如您从代码中看到的,我们可以作为普通JavaScript对象访问person对象。
您可以在github上访问完整的代码:https://github.com/phatak-dev/GraalVMExperiments/blob/master/src/main/scala/com/madhukaraphatak/graalvm/PassClassToJs.scala
小结
GraalVM的多语言特性使得在同一个VM上混合和匹配不同的语言非常有吸引力。在不同语言之间传递值的能力使使用不同语言进行不同计算变得无缝。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2210.html
暂无评论