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

标签 javascript kotlin jvm

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

相关文章:

javascript - 在 AngularJS 中访问多维字典

javascript - php 多选下拉菜单

javascript - JsonConvert.SerializeObject 的输出是否需要在 Razor View 中进行编码?

Kotlin 匿名函数用例?

java - JVM 会垃圾收集内存中的孤立周期吗?

javascript - ANTD 表 getColumnSearchProps 被嵌套对象破坏

java - Spring Boot Kotlin API 为所有端点返回 404 响应

functional-programming - Kotlin - 如何在列表中查找重复值的数量?

java - SQL Developer每次随机崩溃

java - 如何提高不属于您的代码的性能?