Je me demande quelle est la différence entre Class.getResource()
et ClassLoader.getResource()
?
edit: Je veux surtout savoir si une mise en cache est impliquée au niveau du fichier / répertoire. Comme dans "les listes de répertoires sont-elles mises en cache dans la version de classe?"
L'AFAIK devrait essentiellement faire de même, mais ce n'est pas le cas:
getClass().getResource()
getClass().getClassLoader().getResource()
J'ai découvert cela en jouant avec du code de génération de rapport qui crée un nouveau fichier à WEB-INF/classes/
partir d'un fichier existant dans ce répertoire. Lorsque j'utilisais la méthode de Class, je pouvais trouver des fichiers qui étaient là lors du déploiement en utilisant getClass().getResource()
, mais en essayant de récupérer le fichier nouvellement créé, j'ai reçu un objet nul. La navigation dans le répertoire montre clairement que le nouveau fichier est là. Les noms de fichiers ont été précédés d'une barre oblique comme dans "/myFile.txt".
La ClassLoader
version de getResource()
d'autre part a trouvé le fichier généré. D'après cette expérience, il semble qu'il y ait une sorte de mise en cache de la liste des répertoires en cours. Ai-je raison, et si oui, où est-ce documenté?
Depuis les documents de l' API surClass.getResource()
Recherche une ressource avec un nom donné. Les règles de recherche des ressources associées à une classe donnée sont implémentées par le chargeur de classe définissant la classe. Cette méthode délègue au chargeur de classe de cet objet. Si cet objet a été chargé par le chargeur de classe d'amorçage, la méthode délègue à ClassLoader.getSystemResource (java.lang.String).
Pour moi, cela se lit "Class.getResource appelle vraiment son propre chargeur de classe getResource ()". Ce qui reviendrait à le faire getClass().getClassLoader().getResource()
. Mais ce n'est évidemment pas le cas. Quelqu'un pourrait-il me fournir un éclairage sur cette question?