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

时间:2016-01-22 16:49:55

标签: java kotlin

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

有没有办法获得对顶层函数编译成类的引用,以便我可以编写,例如

val myThing = readFromStream(MYCLASS.getResourceAsStream(...))

5 个答案:

答案 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)
}