2017-03-03 41 views
10

我遷移項目科特林,這:科特林:MyClass的:: class.java VS this.javaClass

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

問題是:此方法在src/main/resources內尋找.properties文件。使用:

ObjectFactory::class.java.classLoader... 

它的工作原理,但使用:

this.javaClass.classLoader... 

classLoadernull ...

enter image description here

enter image description here

enter image description here

(注意內存地址也不同)

爲什麼?

感謝

+0

'this.javaClass'的值是什麼? – chrylis

+0

我編輯了我的問題。 –

+0

您是否在運行時或編譯時遇到錯誤? – chrylis

回答

9

如果調用javaClass傳遞給apply拉姆達裏面,這就是所謂的對拉姆達的隱含接收器。由於apply將它自己的接收器(在這種情況下爲Properties())轉換爲lambda的隱式接收器,所以您實際上獲得了您創建的Properties對象的Java類。當然這與你使用ObjectFactory::class.java獲得的Java類ObjectFactory不同。

有關隱式接收器如何在Kotlin中工作的詳細說明,可以閱讀this spec document

+0

謝謝,現在很清楚 –