是否可以从基于kotlin JVM的项目调用javascript函数? 比如我上课了:
class JS{
fun callJS( ){
// somehow call js function
}
}
答案 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以捕获它。