Je me demande quelle est la différence entre Class.getResource()
y ClassLoader.getResource()
?
edit : Je veux surtout savoir si une mise en cache est impliquée au niveau des fichiers/répertoires. Comme dans "les listes de répertoires sont-elles mises en cache dans la version Class ?"
AFAIK, les éléments suivants devraient essentiellement faire la même chose, mais ils ne le font pas :
getClass().getResource()
getClass().getClassLoader().getResource()
J'ai découvert cela en manipulant un code de génération de rapports qui crée un nouveau fichier dans le dossier de l'utilisateur. WEB-INF/classes/
à partir d'un fichier existant dans ce répertoire. En utilisant la méthode de la classe, je pouvais trouver des fichiers qui étaient là lors du déploiement en utilisant getClass().getResource()
mais lorsque j'ai essayé 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".
El 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. Ai-je raison, et si oui, où cela est-il documenté ?
De la Documents de l'API en Class.getResource()
Trouve une ressource avec un nom donné. Les règles pour recherche des ressources associées à une classe donnée sont implémentées par la classe chargeur de classe de la classe. Cette méthode délègue au chargeur de classe de cet objet 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 signifie que "Class.getResource appelle en réalité la fonction getResource() de son propre chargeur de classe". Ce qui reviendrait à faire getClass().getClassLoader().getResource()
. Mais ce n'est manifestement pas le cas. Quelqu'un pourrait-il m'éclairer sur cette question ?