是否可以从基于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以捕获它。