[英]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.