从基于kotlin JVM的项目调用javascript函数

时间:2018-03-29 11:22:34

标签: javascript kotlin jvm

是否可以从基于kotlin JVM的项目调用javascript函数? 比如我上课了:

class JS{

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

1 个答案:

答案 0 :(得分:2)

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

您使用ScriptEngineManager.getEngineByName来获取引擎本身,但这并不允许从Java调用方法。为此,您需要一个Invocable。这是通过首先eval使用脚本(作为Reader或String)然后将其作为Invocable来实现的。

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

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引擎,它使用它来将带有代码的String或者带有代码的读取器评估到文件。这实际上取决于你如何储存它。

然后使用Invocable调用该函数。

请注意,如果函数没有返回任何内容,则返回null,否则返回非null对象。假设当然没有返回null。

无论如何,对于实际的引擎。 ScriptEngineManager位于javax包中,因此您无需添加任何依赖项或库来使用它。您需要一个ScriptEngineManager才能获得引擎本身:

val engineManager = ScriptEngineManager()

ScriptEngineManager只是引擎的管理者。它不能直接用于评估,因为它不是引擎。由于您需要JavaScript引擎,因此请致电getEngineByName,然后传递javascript

val engine = engineManager.getEngineByName("javascript")

这就是扩展功能的用武之地。如果您愿意,可以创建一个新的Reader(或者使用包含源的String)并调用createInvocable:

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

最后,调用函数:

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

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