Kotlin: MyClass:: class.java vs this.javaClass
Я переношу проект в Kotlin, и это:
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)
}
}
}
Очень мило, Котлин!: P
Возникает вопрос: этот метод ищет файл .properties
внутри src/main/resources
. Использование:
ObjectFactory::class.java.classLoader...
он работает, но используя:
this.javaClass.classLoader...
classLoader
null
...
![введите описание изображения здесь]()
![введите описание изображения здесь]()
![введите описание изображения здесь]()
(обратите внимание, что адрес памяти также отличается)
Почему?
Спасибо
Ответы
Ответ 1
Если вы вызываете javaClass
внутри лямбды, переданной в apply
, она вызывает неявный получатель этой лямбда. Поскольку apply
превращает свой собственный приемник (Properties()
в этом случае) в неявный приемник лямбда, вы фактически получаете класс Java созданного вами объекта Properties
. Это, конечно, отличается от класса Java ObjectFactory
, который вы получаете с ObjectFactory::class.java
.
Для очень подробного объяснения того, как неявные приемники работают в Котлине, вы можете прочитать этот спецификационный документ.