Maison >Java >javaDidacticiel >Class.getResource() vs ClassLoader.getResource() : quelle est la différence et quand dois-je utiliser lequel ?

Class.getResource() vs ClassLoader.getResource() : quelle est la différence et quand dois-je utiliser lequel ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 16:58:14662parcourir

Class.getResource() vs. ClassLoader.getResource(): What's the Difference and When Should I Use Which?

Explorer les différences entre Class.getResource() et ClassLoader.getResource()

La distinction entre Class.getResource() et ClassLoader .getResource() réside dans l'interprétation du nom de la ressource.

Ressource relative ou absolue Names

Class.getResource() accepte les noms de ressources « relatifs » et « absolus ». Lors de l'utilisation d'un nom relatif, la ressource est interprétée par rapport au package de la classe. D'un autre côté, ClassLoader.getResource() suppose toujours un chemin absolu.

Pour illustrer ceci :

foo.bar.Baz.class.getResource("xyz.txt"); // relative name
foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt"); // equivalent

Leading Slash

Dans Dans le contexte de Class.getResource(), un nom de ressource préfixé par une barre oblique ("/") est considéré comme absolu. Il s'agit de s'aligner sur le comportement attendu lorsqu'il s'agit de systèmes de fichiers réels.

foo.bar.Baz.class.getResource("/data/xyz.txt"); // absolute name
foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt"); // also absolute

Mise en cache :

Quant à votre question concernant la mise en cache, vous avez raison dans votre observation . Les listes de répertoires sont mises en cache par ClassLoader, mais pas par Class.getResource(). Cela peut conduire à des scénarios dans lesquels les fichiers nouvellement créés ou les modifications de répertoire peuvent ne pas être reflétés immédiatement à l'aide de Class.getResource() mais seraient visibles via ClassLoader.getResource().

La documentation de l'API pour Class.getResource() confirme ce comportement :

"Cette méthode délègue au chargeur de classe de cet objet. Si cet objet a été chargé par le chargeur de classe bootstrap, la méthode délègue à ClassLoader.getSystemResource(java.lang.String)."

Recommandation

En général, il est recommandé d'utiliser ClassLoader.getResource() si vous avez besoin d'accéder à des ressources qui ne peut pas être situé dans le package de la classe. Cependant, si vous travaillez spécifiquement avec des ressources relatives au package de la classe et souhaitez une réflexion immédiate des modifications du répertoire, vous pouvez utiliser Class.getResource() tout en étant conscient de ses limitations de mise en cache.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn