web-dev-qa-db-ja.com

Kotlin:MyClass :: class.Javaと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...

classLoadernull...です.

enter image description here

enter image description here

enter image description here

(メモリアドレスも異なることに注意してください)

どうして?

ありがとう

23

javaClass に渡されたラムダ内でapplyを呼び出すと、暗黙のレシーバーで呼び出されますそのラムダの。 applyは独自のレシーバー(この場合はProperties())をラムダの暗黙のレシーバーに変換するため、効果的にJava Properties作成したオブジェクト。これはもちろん、ObjectFactoryのJavaのクラスとは異なりますObjectFactory::class.Java

Kotlinで暗黙的なレシーバーがどのように機能するかについての詳細な説明については、 この仕様書 を参照してください。

16