Есть ли способ ссылаться на класс 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() 
Intereting Posts
Тип универсального парного типа для дополнительных целей Тип функции с приемником в Scala проекции не допускаются для непосредственных подтипов супертипа Преобразуйте MainActivity с помощью панели действий / панели инструментов и кнопки с плавающей точкой в ​​Anko Сохранить сторонний объект в ORM Android Espresso IntentsMatcher работает на новом устройстве, но не в старом Невозможно создать прослушиватель событий Spring Data в Котлине Kotlin: Как я могу вызвать лямбда-поле, которое имеет общий тип его класса? Есть ли способ войти в PayPal с помощью htmlunit? Как сделать UpdateOrInsert в коллекциях Котлина проверка отражения kotlin с нулевыми типами Scala эквивалентный способ Range для пользовательского класса Соответствующие имена параметра в реализованных / переопределенных методах Как получить SSH вход / выход из одной команды (ssh exec) в Java (текущий: sshj)? Порядок выполнения команд неверен в Kotlin Spek