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