有没有办法为 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()