我想在顶级函数中使用Class.getResourceAsStream()
加载资源。
有没有办法获取编译顶级函数的类的引用,以便我可以编写例如:
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
我发现的另一种方法是在顶层函数内声明一个局部类或匿名对象,并获取其enclosingClass
:
val topLevelClass = object{}.javaClass.enclosingClass
注意:为了正常运行,此声明应放置在顶层或顶级函数内部。然后,您可以使用topLevelClass
作为Class<out Any>
:
fun main(args: Array<String>) {
println(topLevelClass) // class MyFileNameKt
}
在Java 7中,您可以使用顶级函数获取对当前Java类的引用
MethodHandles.lookup().lookupClass()
没有语法可以引用该类。你可以使用Class.forName()访问它。例如,如果文件名为“Hello.kt”,位于“demo”包中,您可以通过调用Class.forName("demo.HelloKt")
来获取该类。
如果没有直接获取引用的方法,我会退而求其次,在当前包中创建一个匿名对象。
val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
作为像detekt这样的代码检查工具会将匿名类标记为EmptyClassBlock
,因此您也可以使用类似于以下内容的东西。
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}