2013-06-20 4 views
1

Я поддерживаю кусок кода, и я не уверен в состоянии.getResourceAsStream класс vs 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.getResourceAsStream и this.getClass(). GetResourceAsStream?

ТИА

ответ

1

Есть ли действительно разница между StorageEngine.class.getResourceAsStream и this.getClass(). GetResourceAsStream?

Да, абсолютно.

  • Если имя ресурса является относительным, он будет относительно пакета, содержащего соответствующий класс
  • Если два класса находятся в разных загрузчиков классов, один может быть в состоянии получить доступ к ресурсу и другой нет

конечно, если this является экземпляром StorageEngine (а не подкласса), то они действительно эквивалентны.

1

Короткий ответ: да, но ни один из них не является правильным способом.

Длинный ответ: разные классы могут загружаться разными загрузчиками классов, каждый из которых имеет доступ к другому набору файлов. Если StorageClass и this были загружены разными загрузчиками классов, то вполне возможно, что один вызов вернет null, а другой - другим.

Лучший многоборье подход заключается в следующем:

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

В простом пакетированного приложения, некоторые люди считают это излишним. Где это действительно полезно в веб-приложении, где различные части приложения могут загружаться разными загрузчиками классов.

только время, IMO, что вы должны загрузить с помощью явного класса, когда вы пишете код библиотеки и хотите, чтобы убедиться, что вы получаете вашей копии конкретного ресурса. Эта ситуация крайне редка; обычно библиотека хочет использовать ресурсы, упакованные приложением.