Есть ли способ ссылаться на класс Java для функции верхнего уровня Kotlin?
Я хочу загрузить ресурс в функции верхнего уровня, используя Class.getResourceAsStream()
.
Есть ли способ получить ссылку на класс, который будет скомпилирован функцией верхнего уровня, чтобы я мог писать, например
val myThing = readFromStream(MYCLASS.getResourceAsStream(...))
Ответы
Ответ 1
Другой способ, который я нашел, - объявить локальный класс или анонимный объект внутри функции верхнего уровня и получить его enclosingClass
:
val topLevelClass = object : Any() {}.javaClass.enclosingClass
Примечание: для работы это объявление должно быть размещено на верхнем уровне или внутри функции верхнего уровня.
Затем вы можете использовать topLevelClass
как Class<out Any>
:
fun main(args: Array<String>) {
println(topLevelClass) // class MyFileNameKt
}
Ответ 2
Нет, нет синтаксиса для ссылки на этот класс. Вы можете получить доступ к нему, используя Class.forName(). Например, если файл называется "Hello.kt" и находится в пакете "demo", вы можете получить класс, вызвав Class.forName("demo.HelloKt")
.
Ответ 3
В отсутствие способа получить ссылку напрямую, я отказался от создания анонимного объекта в текущем пакете
val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
Ответ 4
С помощью Java 7 вы можете получить ссылку на текущий класс Java из функции верхнего уровня, используя
MethodHandles.lookup().lookupClass()
Ответ 5
В качестве линтеров, таких как detekt, будут отмечать анонимные классы как EmptyClassBlock
, вы также можете использовать что-то вроде
internal object Resources
fun resourceStream(name: String): InputStream {
return Resources.javaClass.getResourceAsStream(name)
}