Gostaria de saber qual é a diferença entre Class.getResource()
e ClassLoader.getResource()
?
editar: Quero saber especialmente se há armazenamento em cache no nível do arquivo / diretório. Como em "as listagens de diretório são armazenadas em cache na versão da classe?"
AFAIK o seguinte deve essencialmente fazer o mesmo, mas não é:
getClass().getResource()
getClass().getClassLoader().getResource()
Descobri isso ao mexer em algum código de geração de relatório que cria um novo arquivo a WEB-INF/classes/
partir de um arquivo existente nesse diretório. Ao usar o método de Class, pude encontrar arquivos que estavam lá na implantação usando getClass().getResource()
, mas ao tentar buscar o arquivo recém-criado, recebi um objeto nulo. Navegar no diretório mostra claramente que o novo arquivo está lá. Os nomes dos arquivos foram anexados com uma barra como em "/myFile.txt".
A ClassLoader
versão do, getResource()
por outro lado, encontrou o arquivo gerado. A partir dessa experiência, parece que há algum tipo de cache da listagem de diretórios em andamento. Estou certo e, em caso afirmativo, onde isso está documentado?
Nos documentos da API emClass.getResource()
Localiza um recurso com um determinado nome. As regras para pesquisar recursos associados a uma determinada classe são implementadas pelo carregador de classes que define a classe. Este método delega para o carregador de classes deste objeto. Se este objeto foi carregado pelo carregador de classes de autoinicialização, o método delega para ClassLoader.getSystemResource (java.lang.String).
Para mim, diz "Class.getResource está realmente chamando getResource () do seu próprio carregador de classe". O que seria o mesmo que fazer getClass().getClassLoader().getResource()
. Mas obviamente não é. Alguém poderia me fornecer alguma iluminação sobre este assunto?