簡體   English   中英

從基於Kotlin JVM的項目中調用javascript函數

[英]Call javascript function from kotlin JVM based project

是否可以從基於kotlin JVM的項目中調用javascript函數? 例如,我上課了:

class JS{

 fun callJS( ){
  // somehow call js function
 }
}

您可以使用帶有JavaScript的ScriptEngineManager作為引擎。

您可以使用ScriptEngineManager.getEngineByName來獲取引擎本身,但是不允許從Java調用方法。 為此,您需要一個Invocable。 首先eval腳本(作為閱讀器或字符串),然后將其強制轉換為可調用對象。

我個人更喜歡為此使用兩個擴展功能。 兩者都不需要,但是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引擎,它使用它來評估帶有代碼的String或帶有代碼的文件閱讀器。 這實際上取決於您如何存儲它。

然后使用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來捕獲它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM