Подтвердить что ты не робот

Class.getResource и ClassLoader.getSystemResource: есть ли причина предпочесть друг другу?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

От Class.getResource( )

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

и ClassLoader.getSystemResource( )

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

Ответ 3

ClassLoader.getSystemResource() будет использовать загрузчик bootstrap (system).

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