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

2022-09-01 14:43:17

我正在将一个项目迁移到 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

问题是:此方法在 里面查找文件。用:.propertiessrc/main/resources

ObjectFactory::class.java.classLoader...

它的工作原理,但使用:

this.javaClass.classLoader...

classLoader是。。。null

enter image description here

enter image description here

enter image description here

(注意内存地址也不同)

为什么?

谢谢


答案 1

如果您在传递到应用的 lambda 内部调用,则会在该 lambda 的隐式接收器上调用它。由于将自己的接收器(在本例中)转换为 lambda 的隐式接收器,因此您有效地获取了所创建对象的 Java 类。这当然不同于你使用的Java类。javaClassapplyProperties()PropertiesObjectFactoryObjectFactory::class.java

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


答案 2

推荐