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?
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()
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
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);
}
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.