Подтвердить что ты не робот

Есть ли способ ссылаться на класс Java для функции верхнего уровня Kotlin?

Я хочу загрузить ресурс в функции верхнего уровня, используя Class.getResourceAsStream().

Есть ли способ получить ссылку на класс, который будет скомпилирован функцией верхнего уровня, чтобы я мог писать, например

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

Ответ 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)
}