是否可以从基于 kotlin JVM 的项目调用 javascript 函数? 比如我上课了:
class JS{
fun callJS( ){
// somehow call js function
}
}
最佳答案
您可以使用带有 JavaScript 的 ScriptEngineManager 作为引擎。
您使用 ScriptEngineManager.getEngineByName 来获取引擎本身,但这不允许从 Java 调用方法。为了做到这一点,您需要一个 Invocable。这是通过首先eval
评估脚本(作为 Reader 或 String)然后将其转换为 Invocable 来完成的。
我个人更喜欢为此使用两个扩展函数。您不需要两者都需要,但有一个用于 Readers,一个用于 Strings:
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 引擎,它使用它来评估带有代码的字符串或带有代码的文件的读取器。这实际上取决于您如何存储它。
然后使用 Invocable 来调用该函数。
请注意,如果函数没有返回任何内容,则返回 null,否则返回非 null 对象。当然,这是假设没有返回 null。
无论如何,对于实际的引擎。 ScriptEngineManager位于javax包中,因此您无需添加任何依赖项或库即可使用它。您需要一个 ScriptEngineManager 才能获取引擎本身:
val engineManager = ScriptEngineManager()
ScriptEngineManager 只是引擎的管理器。它不能直接用于评估,因为它不是引擎。由于您需要 JavaScript 引擎,因此您调用 getEngineByName
,并传递 javascript
:
val engine = engineManager.getEngineByName("javascript")
这就是扩展函数的用武之地。创建一个新的 Reader(或者如果您愿意,可以使用带有源的字符串)并调用 createInvocable:
val invocable = Files.newBufferedReader(Paths.get("dir")).createInvocable(engine)
最后,调用该函数:
invocable.invokeFunction("name", "arguments")//there can be no arguments
如果有返回值,请添加 var 或 val 来捕获它。
关于javascript - 从基于 kotlin JVM 的项目调用 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49554822/