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) } } }
非常好,Kotlin! :P
问题是:这个方法在src/main/resources
里查找一个.properties
文件。 使用:
ObjectFactory::class.java.classLoader...
它的工作原理,但使用:
this.javaClass.classLoader...
classLoader
为null
…
(注意内存地址也不同)
为什么?
谢谢
如果您调用传递给apply
的lambda中的javaClass
在该lambda的隐式接收方上调用它。 由于apply
将自己的接收器(在这种情况下是Properties()
)转换为lambda的隐式接收器,所以您实际上正在获取已创建的Properties
对象的Java类。 这与使用ObjectFactory::class.java
获得的ObjectFactory
的Java类完全不同。
有关隐式接收器如何在Kotlin中工作的非常全面的解释,您可以阅读这个规范文档 。