Интересно, в чем разница между Class.getResource()
и ClassLoader.getResource()
?
edit: я особенно хочу знать, задействовано ли какое-либо кэширование на уровне файлов / каталогов. Как в «кэшируются ли списки каталогов в версии класса?»
AFAIK следующие должны по существу делать то же самое, но это не так:
getClass().getResource()
getClass().getClassLoader().getResource()
Я обнаружил это, когда возился с кодом генерации отчетов, который создает новый файл в WEB-INF/classes/
из существующего файла в этом каталоге. При использовании метода из класса я мог найти файлы, которые были там при развертывании, используя getClass().getResource()
, но при попытке извлечь только что созданный файл я получил нулевой объект. Просмотр каталога ясно показывает, что новый файл есть. К именам файлов добавляется косая черта, как в "/myFile.txt".
С другой стороны, ClassLoader
версия getResource()
нашла сгенерированный файл. Из этого опыта кажется, что происходит какое-то кэширование списка каталогов. Я прав, и если да, то где это задокументировано?
Из API документов на Class.getResource()
Находит ресурс
с заданным именем. Правила для
поиск ресурсов, связанных с
данный класс реализуется
определение класса загрузчик класса.
Этот метод делегирует этому объекту
класс загрузчик. Если этот объект был
загружается загрузчиком класса начальной загрузки,
метод делегирует
ClassLoader.getSystemResource (java.lang.String).
Для меня это выглядит так: «Class.getResource действительно вызывает свой собственный загрузчик классов getResource ()». Что было бы так же, как делать getClass().getClassLoader().getResource()
. Но это явно не так. Может ли кто-нибудь дать мне некоторое представление об этом?