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
...
(notez que l'adresse mémoire est également différente)
Pourquoi?
Merci
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 .