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

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

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

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

Другой способ, который я нашел, – объявить локальный класс или анонимный объект внутри функции верхнего уровня и получить его enclosingClass :

 val topLevelClass = object : Any() {}.javaClass.enclosingClass 

Примечание: для работы это объявление должно быть размещено на верхнем уровне или внутри функции верхнего уровня.

Затем вы можете использовать topLevelClass как Class<out Any> :

 fun main(args: Array<String>) { println(topLevelClass) // class MyFileNameKt } 

Нет, нет синтаксиса для ссылки на этот класс. Вы можете получить доступ к нему, используя Class.forName (). Например, если файл называется «Hello.kt» и находится в пакете «demo», вы можете получить класс, вызвав Class.forName("demo.HelloKt") .

В отсутствие способа получить ссылку напрямую, я вернулся к созданию анонимного объекта в текущем пакете

 val myThing = object: Any() {}.javaClass.getResourceAsStream(...) 

Поскольку линтеры, такие как detekt, будут помечать анонимные классы как EmptyClassBlock вы также можете использовать что-то вроде

 internal object Resources fun resourceStream(name: String): InputStream { return Resources.javaClass.getResourceAsStream(name) } 

С помощью Java 7 вы можете получить ссылку на текущий класс Java из функции верхнего уровня, используя

 MethodHandles.lookup().lookupClass()