有没有办法为Kotlin顶级函数引用Java类?

Dun*_*gor 18 java kotlin

我想使用顶层函数加载资源Class.getResourceAsStream().

有没有办法获得对顶层函数将被编译成的类的引用,以便我可以编写,例如

val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
Run Code Online (Sandbox Code Playgroud)

小智 11

使用 Java 7,您可以使用从顶级函数中获取对当前 Java 类的引用

MethodHandles.lookup().lookupClass()
Run Code Online (Sandbox Code Playgroud)


yol*_*ole 10

不,没有语法可以引用该类.您可以使用Class.forName()访问它.例如,如果文件名为"Hello.kt"并且位于包"demo"中,则可以通过调用获取该类Class.forName("demo.HelloKt").


hot*_*key 9

我发现的另一种方法是在顶级函数中声明一个本地类或一个匿名对象并获取它enclosingClass:

val topLevelClass = object : Any() {}.javaClass.enclosingClass
Run Code Online (Sandbox Code Playgroud)

注意:要工作,此声明应放在顶层或顶层函数内.

然后你可以topLevelClass用作Class<out Any>:

fun main(args: Array<String>) {
    println(topLevelClass) // class MyFileNameKt
}
Run Code Online (Sandbox Code Playgroud)

  • 关于加载资源,不,没有。但这实际上是获得顶级类反射的方法,除了资源之外,还可能需要这种反射。 (2认同)

Dun*_*gor 6

在没有直接获取引用的方法的情况下,我已经在当前包中创建了一个匿名对象

val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
Run Code Online (Sandbox Code Playgroud)