2013-06-20 44 views
1

我在維護一段代碼,我不確定是否有條件。getResourceAsStream類與getClass()

resourceStream = StorageEngine.class.getResourceAsStream(resourceFile); 
if (resourceStream == null) { 
    log.info("StorageEngine: didn't find resource file in the classes root "); 
    resourceStream = this.getClass().getResourceAsStream(resourceFile); 
} 

是否真的StorageEngine.class.getResourceAsStreamthis.getClass()。的getResourceAsStream之間的差異?

TIA

回答

1

是否真的StorageEngine.class.getResourceAsStream和this.getClass()。的getResourceAsStream之間的區別嗎?

是的,絕對。

  • 如果資源名稱是一個相對的一個,這將是相對於包含相關類
  • 如果這兩個類在不同的類加載器,一個可能能夠訪問資源包和其他不

當然,如果thisStorageEngine(而不是子類)的實例,那麼它們確實是等價的。

1

簡答:是的,但都不是真正做到這一點的正確方法。

長答案:不同的類可能由不同的類加載器加載,其中每個類都可以訪問不同的文件集。如果StorageClassthis由不同的類加載器加載,那麼完全可能的是一個調用將返回null而另一個成功。

的最全面的方法如下:

Thread.currentThread().getContextClassLoader().getResourceAsStream("/absolute_path"); 

在一個簡單的打包應用程序,有些人認爲這是矯枉過正。其中真正有用的地方在於web應用程序,應用程序的不同部分可能由不同的類加載器加載。

只有時間,海事組織,你應該加載使用一個明確的類是當你寫的代碼庫,並要確保你得到你的一個特定資源的副本。這種情況非常罕見。通常庫要使用由應用程序打包的資源。

相關問題