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

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

例如,有没有什么办法可以获得对顶级函数进行编译的类的引用,以便我可以编写它

 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这样的linters会将匿名类标记为EmptyClassBlock你也可以使用类似的东西

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

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

 MethodHandles.lookup().lookupClass()