Maison >Java >javaDidacticiel >Class.getResource() vs ClassLoader.getResource() : quelle est la différence et quand dois-je utiliser lequel ?
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!