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

2023-12-25

是否可以从基于 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(或者如果您愿意,可以将 String 与源一起使用)并调用 createInvocable:

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

最后,调用该函数:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从基于 kotlin JVM 的项目调用 javascript 函数 的相关文章

随机推荐