Интересно, в чем разница между 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()
. Но это явно не так. Не мог бы кто-нибудь пролить свет на этот вопрос?