我想使用Class.getResourceAsStream()
加載頂級函數中的資源。有沒有辦法引用Kotlin頂級函數的Java類?
有沒有辦法達到那個頂層函數會被編譯成這樣我可以寫類的引用,例如
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
我想使用Class.getResourceAsStream()
加載頂級函數中的資源。有沒有辦法引用Kotlin頂級函數的Java類?
有沒有辦法達到那個頂層函數會被編譯成這樣我可以寫類的引用,例如
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
我發現另一種方式是聲明一個頂級函數內部局部類或匿名對象,並獲得其enclosingClass
:
val topLevelClass = object : Any() {}.javaClass.enclosingClass
注意:要工作,該聲明應放置在頂層或頂層函數中。
然後你就可以使用topLevelClass
爲Class<out Any>
:
fun main(args: Array<String>) {
println(topLevelClass) // class MyFileNameKt
}
沒有,沒有語法來引用類。你可以使用Class.forName()來訪問它。例如,如果該文件被稱爲「Hello.kt」並且位於包「demo」中,則可以通過調用Class.forName("demo.HelloKt")
來獲得該類。
在沒有的辦法直接獲取一個參考,我已經回落在當前包中創建一個匿名對象
val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
由於棉短絨像detekt會標誌匿名類爲EmptyClassBlock
,你也可以使用類似
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}
使用Java 7,您可以使用
MethodHandles.lookup().lookupClass()
這是一個關於Kotlin的問題 –
這是有效的Kotlin代碼。你可以從Kotlin調用Java。這就是爲什麼我提到頂級(Kotlin)函數是這個問題的關鍵。 – hunterwb
是的,你是對的。不幸的是,除非進行編輯,否則SO不會讓我高興。 –
頂級功能獲取到當前的Java類的引用是否有任何這只是獲得匿名對象的類的優點嗎? –
關於加載資源,不,沒有。但這實際上是獲得最高級別的反思的方式,除了資源之外,哪一個可能需要。 – hotkey