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.

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