web-dev-qa-db-fra.com

Class.getResource et ClassLoader.getSystemResource: existe-t-il une raison de préférer l'une à l'autre?

J'ai vu à la fois Class.getResource et ClassLoader.getSystemResource utilisés pour localiser une ressource en Java. Y a-t-il une raison de préférer l'un à l'autre?

28
vitaut

Il existe plusieurs façons de charger des ressources, chacune avec une signification légèrement différente - 

ClassLoader::getSystemResource() utilise le chargeur de classes du système. Cela utilise le classpath utilisé pour démarrer le programme. Si vous vous trouvez dans un conteneur Web tel que Tomcat, cela ne récupérera PAS les ressources de votre fichier WAR.

Class<T>#getResource() ajoute le nom du package de la classe au nom de la ressource, puis le délègue à son chargeur de classe. Si vos ressources sont stockées dans une hiérarchie de packages qui reflète vos classes, utilisez cette méthode. 

ClassLoader#getResource() délègue à son chargeur de classe parent. Cela finira par rechercher la ressource jusqu’au chargeur de classe du système. 

Si vous êtes confus, restez-en à ClassLoader#getResource()

35

De Class.getResource( )

Cette méthode délègue l'appel à son chargeur de classe, après avoir fait ces passe au nom de la ressource: si le Le nom de la ressource commence par "/", il s'agit de inchangé; sinon, le nom du package est ajouté au nom de la ressource après conversion "." à "/". Si ce l'objet a été chargé par le bootstrap chargeur, l'appel est délégué à ClassLoader.getSystemResource

et ClassLoader.getSystemResource( )

Trouver une ressource du nom spécifié à partir du chemin de recherche utilisé pour charger Des classes. Cette méthode localise le ressource via la classe système chargeur

3
sgokhales

Utilisation de méthodes de Java.lang.Class:

public Java.net.URL getResource(String name) {
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) {
    return ClassLoader.getSystemResource(name);  // A system class.
  }
  return cl.getResource(name);
}
0
01pshe

ClassLoader.getSystemResource() utilisera le chargeur de classes bootstrap (système). 

Class.getResource() utilisera cette instance particulière du chargeur de classe de Class, autrement dit, quel que soit le chargeur de classe utilisé pour charger cette classe. Cela peut être un chargeur de classe différent du chargeur de classe système.

0
David