Class.getResource и ClassLoader.getSystemResource: есть ли причина предпочитать одно другому? - PullRequest
30 голосов
/ 09 июня 2011

Я видел Class.getResource и ClassLoader.getSystemResource, используемые для поиска ресурса в Java. Есть ли причина предпочитать одно другому?

Ответы [ 4 ]

36 голосов
/ 10 июня 2011

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

ClassLoader::getSystemResource() использует системный загрузчик классов. При этом используется путь к классу, который использовался для запуска программы. Если вы находитесь в веб-контейнере, таком как tomcat, он НЕ будет забирать ресурсы из вашего файла WAR.

Class<T>#getResource() добавляет имя пакета класса к имени ресурса, а затем делегирует его загрузчику классов. Если ваши ресурсы хранятся в иерархии пакетов, которая отражает ваши классы, используйте этот метод.

ClassLoader#getResource() делегирует его родительскому загрузчику классов. Это в конечном итоге будет искать ресурс вплоть до системного загрузчика классов.

Если вы запутались, просто придерживайтесь ClassLoader#getResource()

3 голосов
/ 09 июня 2011

С Class.getResource( )

Этот метод делегирует вызов его загрузчик классов, сделав изменяется на имя ресурса: если имя ресурса начинается с "/", оно без изменений; в противном случае имя пакета добавляется к имени ресурса после преобразования "." в "/". Если это объект был загружен загрузчиком загрузчик, вызов делегирован ClassLoader.getSystemResource.

и ClassLoader.getSystemResource( )

Найти ресурс с указанным именем из пути поиска, используемого для загрузки классы. Этот метод находит ресурс через системный класс Загрузчик

0 голосов
/ 28 марта 2018

Использование методов java.lang.Class:

public java.net.URL getResource(String name) {
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) {
    return ClassLoader.getSystemResource(name);  // A system class.
  }
  return cl.getResource(name);
}
0 голосов
/ 09 июня 2011

ClassLoader.getSystemResource() будет использовать загрузчик (системный) загрузчик классов.

Class.getResource() будет использовать этот конкретный экземпляр загрузчика классов Class, другими словами, какой бы загрузчик классов не использовался для загрузки этого класса. Это может быть другой загрузчик классов, чем системный загрузчик классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...