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

Разница между getClass(). GetClassLoader(). GetResource() и getClass.getResource()?

При извлечении файлов из ресурсов, которые я должен использовать при каких обстоятельствах?

4b9b3361

Ответ 1

Второй вызывает первый. Разница описана в javadoc.

Первый принимает пути, которые не начинаются с /, и всегда начинается с корня пути к классам.

Второй принимает путь, начинающийся с /. Если это так, оно начинается с корня пути к классам. Если нет, он начинается с пакета класса, на который вызывается метод.

Итак, getClass().getClassLoader().getResource("foo/bar.txt") эквивалентно getClass().getResource("/foo/bar.txt").

И, если getClass() возвращает класс, находящийся в пакете foo, getClass().getResource("bar.txt") эквивалентен getClass().getClassLoader().getResource("foo/bar.txt")

Ответ 2

какой я должен использовать при каких обстоятельствах?

Ни. Вы должны позвонить Thread.currentThread().getContextClassLoader().

Это может не измениться в зависимости от того, звоните ли вы из статического или экземплярного метода.

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

Ответ 3

В принципе, Class.getResource() позволяет указать путь относительно пакета класса, тогда как ClassLoader.getResource() всегда является "абсолютным" путем.

Итак:

foo.bar.Baz.class.getResource("data.txt")

эквивалентно:

some.Other.class.getResource("/foo/bar/data.txt")

и они оба эквивалентны:

some.Other.class.getClassLoader().getResource("foo/bar/data.txt")

(Предполагая, что some.Other и foo.bar.Baz загружаются одним и тем же загрузчиком классов, конечно.)