我想使用Class.getResourceAsStream()
在顶级函数中加载资源。
有没有办法获得对顶层函数编译成类的引用,以便我可以编写,例如
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
答案 0 :(得分:10)
不,没有语法可以引用该类。您可以使用Class.forName()访问它。例如,如果文件名为“Hello.kt”并且位于包“demo”中,则可以通过调用Class.forName("demo.HelloKt")
来获取该类。
答案 1 :(得分:9)
我找到的另一种方法是在顶级函数中声明一个本地类或一个匿名对象并获取它的enclosingClass
:
val topLevelClass = object : Any() {}.javaClass.enclosingClass
注意:要工作,此声明应放在顶层或顶层函数内。
然后,您可以将topLevelClass
用作Class<out Any>
:
fun main(args: Array<String>) {
println(topLevelClass) // class MyFileNameKt
}
答案 2 :(得分:6)
如果没有直接获取引用的方法,我已经重新开始在当前包中创建一个匿名对象
val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
答案 3 :(得分:3)
使用Java 7,您可以使用
从顶级函数获取对当前Java类的引用MethodHandles.lookup().lookupClass()
答案 4 :(得分:0)
像detekt这样的短语会将匿名类标记为EmptyClassBlock
,您也可以使用类似
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}