从基于Kotlin JVM的项目调用JavaScript函数



是否可以从基于Kotlin JVM的项目中调用JavaScript函数?例如,我上课:

class JS{
 fun callJS( ){
  // somehow call js function
 }
}

您可以将带有JavaScript的ScriptEngineManager用作引擎。

您使用scriptEngeneManager.getEngineByName获取引擎本身,但这不允许从Java进行调用方法。为了做到这一点,您需要一个可启用。这是通过首先 eval来完成脚本(作为读取器或字符串(,然后将其施放为可恶。

我个人更喜欢使用两个扩展功能。您不需要两者,但是有一个读者,一个用于字符串:

fun String.createInvocable(engine: ScriptEngine) : Invocable {
    engine.eval(this);
    return engine as Invocable;
}
fun Reader.createInvocable(engine: ScriptEngine) : Invocable{
    engine.eval(this)
    return engine as Invocable
}

此处的引擎是JavaScript引擎,它使用它来评估带有代码的字符串,或者使用代码来评估文件。这确实取决于您如何存储它。

然后您使用Invococtable调用该功能。

请注意,如果该功能没有返回,则它将返回NULL,否则它给出了一个非NULL对象。假设null当然不会返回。

无论如何,对于实际发动机。ScriptEngineManager在Javax软件包中,因此您无需添加任何依赖项或库即可使用它。您需要一个ScriptEngineManager才能获得引擎本身:
val engineManager = ScriptEngineManager()

ScriptEngineManager只是引擎的经理。它不能直接用于评估,因为它不是引擎。由于您想要JavaScript引擎,因此请致电getEngineByName,然后通过javascript

val engine = engineManager.getEngineByName("javascript")

这就是扩展功能的来源。创建一个新的读取器(或使用源(如果您愿意,将字符串(使用(并调用CreateInvocobable:

val invocable = Files.newBufferedReader(Paths.get("dir")).createInvocable(engine)

最后,调用函数:

invocable.invokeFunction("name", "arguments")//there can be no arguments

如果您有返回值,请添加var或val以捕获它。

最新更新