web-dev-qa-db-fra.com

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

Je migre un projet vers Kotlin, et ceci:

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;
}

est maintenant:

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

très gentil, Kotlin! : P

La question est: cette méthode recherche un .properties fichier à l'intérieur src/main/resources. En utilisant:

ObjectFactory::class.Java.classLoader...

cela fonctionne, mais en utilisant:

this.javaClass.classLoader...

classLoader est null...

enter image description here

enter image description here

enter image description here

(notez que l'adresse mémoire est également différente)

Pourquoi?

Merci

23
Matias Elorriaga

Si vous appelez javaClass à l'intérieur d'un lambda passé à apply , il est appelé sur le récepteur implicite de cette lambda. Puisque apply transforme son propre récepteur (Properties() dans ce cas) en récepteur implicite du lambda, vous obtenez effectivement la classe Java de la classe Properties objet que vous avez créé. Ceci est bien sûr différent de la classe Java de ObjectFactory que vous obtenez avec ObjectFactory::class.Java.

Pour une explication très approfondie du fonctionnement des récepteurs implicites dans Kotlin, vous pouvez lire ce document spécifique .

16
Alexander Udalov