有没有办法为 Kotlin 顶级函数引用 Java class?
Is there a way to reference the Java class for a Kotlin top-level function?
我想使用 Class.getResourceAsStream()
在顶级函数中加载资源。
有什么方法可以获取对 class 的引用,顶级函数将被编译成这样我就可以编写,例如
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
不,没有引用 class 的语法。您可以使用 Class.forName() 访问它。例如,如果文件名为 "Hello.kt" 并且位于包 "demo" 中,则可以通过调用 Class.forName("demo.HelloKt")
.
来获取 class
由于没有直接获取引用的方法,我退而求其次在当前包中创建一个匿名对象
val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
因为像 detekt 这样的 linters 会将匿名 类 标记为 EmptyClassBlock
你也可以使用像
这样的东西
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}
我发现的另一种方法是在顶级函数中声明一个本地 class 或匿名对象并获取它的 enclosingClass
:
val topLevelClass = object{}.javaClass.enclosingClass
注意:要起作用,此声明应放在顶层或顶层函数内。
然后你可以使用 topLevelClass
作为 Class<out Any>
:
fun main(args: Array<String>) {
println(topLevelClass) // class MyFileNameKt
}
使用 Java 7 您可以使用
从顶级函数获取对当前 Java class 的引用
MethodHandles.lookup().lookupClass()
我想使用 Class.getResourceAsStream()
在顶级函数中加载资源。
有什么方法可以获取对 class 的引用,顶级函数将被编译成这样我就可以编写,例如
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
不,没有引用 class 的语法。您可以使用 Class.forName() 访问它。例如,如果文件名为 "Hello.kt" 并且位于包 "demo" 中,则可以通过调用 Class.forName("demo.HelloKt")
.
由于没有直接获取引用的方法,我退而求其次在当前包中创建一个匿名对象
val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
因为像 detekt 这样的 linters 会将匿名 类 标记为 EmptyClassBlock
你也可以使用像
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}
我发现的另一种方法是在顶级函数中声明一个本地 class 或匿名对象并获取它的 enclosingClass
:
val topLevelClass = object{}.javaClass.enclosingClass
注意:要起作用,此声明应放在顶层或顶层函数内。
然后你可以使用 topLevelClass
作为 Class<out Any>
:
fun main(args: Array<String>) {
println(topLevelClass) // class MyFileNameKt
}
使用 Java 7 您可以使用
从顶级函数获取对当前 Java class 的引用MethodHandles.lookup().lookupClass()