I saw both Class.getResource
and ClassLoader.getSystemResource
used to locate a resource in Java. Is there any reason to prefer one to another?
ClassLoader.getSystemResource()
will use the bootstrap (system) classloader.
Class.getResource()
will use that particular instance of Class
's classloader, in other words whatever classloader was used to load that class. This may be a different classloader than the system classloader.
There are several ways to load resources, each with a slightly different meaning -
ClassLoader::getSystemResource()
uses the system classloader. This uses the classpath that was used to start the program. If you are in a web container such as tomcat, this will NOT pick up resources from your WAR file.
Class<T>#getResource()
prepends the package name of the class to the resource name, and then delegates to its classloader. If your resources are stored in a package hierarchy that mirrors your classes, use this method.
ClassLoader#getResource()
delegates to its parent classloader. This will eventually search for the resource all the way upto the system classloader.
If you are confused, just stick to ClassLoader#getResource()
Using Methods of 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);
}
From Class.getResource( )
This method delegates the call to its class loader, after making these changes to the resource name: if the resource name starts with "/", it is unchanged; otherwise, the package name is prepended to the resource name after converting "." to "/". If this object was loaded by the bootstrap loader, the call is delegated to
ClassLoader.getSystemResource
.
and ClassLoader.getSystemResource( )
Find a resource of the specified name from the search path used to load classes. This method locates the resource through the system class loader