Интересно какая разница между Class.getResource()
а ClassLoader.getResource()
?
редактировать: я особенно хочу знать, если какое-либо кэширование на уровне файлов / каталогов. Как в "кэшируются ли списки каталогов в версии класса?"
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()
. Но это явно не так. Может ли кто-нибудь дать мне некоторое представление об этом?