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... 

classLoadernull

在这里输入图像描述

在这里输入图像描述

在这里输入图像描述

(注意内存地址也不同)

为什么?

谢谢

如果您调用传递给apply的lambda中的javaClass在该lambda的隐式接收方上调用它。 由于apply将自己的接收器(在这种情况下是Properties() )转换为lambda的隐式接收器,所以您实际上正在获取已创建的Properties对象的Java类。 这与使用ObjectFactory::class.java获得的ObjectFactory的Java类完全不同。

有关隐式接收器如何在Kotlin中工作的非常全面的解释,您可以阅读这个规范文档 。