【发布时间】:2016-01-22 16:49:54
【问题描述】:
我想使用 Class.getResourceAsStream() 在顶级函数中加载资源。
有没有什么方法可以获取对顶层函数将被编译成的类的引用,以便我可以编写,例如
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
【问题讨论】:
我想使用 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 这样的 linter 会将匿名类标记为 EmptyClassBlock 你也可以使用类似的东西
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}
【讨论】: