Kotlin: MyClass :: class.java vs this.javaClass

Я переношу проект в Котлин, и это:

public static Properties provideProperties(String propertiesFileName) { Properties properties = new Properties(); InputStream inputStream = null; try { inputStream = ObjectFactory.class.getClassLoader().getResourceAsStream(propertiesFileName); properties.load(inputStream); return properties; } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } 

сейчас:

 fun provideProperties(propertiesFileName: String): Properties? { return Properties().apply { ObjectFactory::class.java.classLoader.getResourceAsStream(propertiesFileName).use { stream -> load(stream) } } } 

очень приятно, Котлин! :П

Возникает вопрос: этот метод ищет файл .properties внутри src/main/resources . С помощью:

 ObjectFactory::class.java.classLoader... 

он работает, но используя:

 this.javaClass.classLoader... 

classLoader имеет значение null

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

(обратите внимание, что адрес памяти также отличается)

Зачем?

благодаря

Если вы вызываете javaClass внутри пройденного лямбды, он вызывает неявный получатель этой лямбда. Так как apply превращает свой собственный приемник ( Properties() в этом случае) в неявный приемник лямбда, вы фактически получаете класс Java созданного объекта Properties . Это, конечно, отличается от класса Java ObjectFactory который вы получаете с ObjectFactory::class.java .

Для очень подробного объяснения того, как неявные приемники работают в Котлине, вы можете прочитать этот спецификационный документ .

Intereting Posts
Может ли класс данных Kotlin иметь более одного конструктора? Как заменить webView пользовательским webView? только классы разрешены в левой части литерала класса при использовании Mockito и kotlin Обработка истекших ссылок при разборе JSON из приложения Android Firebase Admin SDK не может подключаться к базе данных из внутреннего файла jar Котлин: дженерики и дисперсия Как вызвать функцию в kotlin с сырыми типами Kotlin – Как «запоздать» var переопределил интерфейс? Как динамически масштабировать отскок потока эмиссионных выбросов? Создание нескольких конструкторов Kotlin, которые не имеют общих параметров Параметры класса данных валидации Котлин Почему неразрешенная ссылка на попытку доступа к постоянным значениям? Как вводить зависимости в ktor Application kotlin работает с ресурсами (массив и параметр функции) MVP + RxJava. Поместите планировщиков в презентаторе или в Interactor?