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