有没有一种方法可以引用 Kotlin 顶层函数的 Java 类?

30

我想在顶级函数中使用Class.getResourceAsStream()加载资源。

有没有办法获取编译顶级函数的类的引用,以便我可以编写例如:

val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
5个回答

21

我发现的另一种方法是在顶层函数内声明一个局部类或匿名对象,并获取其enclosingClass

val topLevelClass = object{}.javaClass.enclosingClass
注意:为了正常运行,此声明应放置在顶层或顶级函数内部。

然后,您可以使用topLevelClass作为Class<out Any>

fun main(args: Array<String>) {
    println(topLevelClass) // class MyFileNameKt
}

这样做有什么优势,而不是只获取匿名对象的类? - Duncan McGregor
2
关于加载资源,实际上没有。但这是获取顶层类反射的方式,除了资源之外还可能需要它。 - hotkey

16

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

MethodHandles.lookup().lookupClass()

这是关于 Kotlin 的问题。 - Keldon Alleyne
是的,你说得对。不幸的是,如果没有进行编辑,SO不会允许我点赞。 - Keldon Alleyne
1
点赞。匿名对象方法似乎有些取巧。 - Abhijit Sarkar

12

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


6

如果没有直接获取引用的方法,我会退而求其次,在当前包中创建一个匿名对象。

val myThing = object: Any() {}.javaClass.getResourceAsStream(...)

1

作为像detekt这样的代码检查工具会将匿名类标记为EmptyClassBlock,因此您也可以使用类似于以下内容的东西。

internal object Resources

fun resourceStream(name: String): InputStream {
    return Resources.javaClass.getResourceAsStream(name)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接