gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:14:35 25 4
gpt4 key购买 nike

是否可以从基于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com