java.lang.ClassLoader#getResource
/**
* Finds the resource with the given name. A resource is some data
* (images, audio, text, etc) that can be accessed by class code in a way
* that is independent of the location of the code.
*
* <p> The name of a resource is a '<tt>/</tt>'-separated path name that
* identifies the resource.
*
* <p> This method will first search the parent class loader for the
* resource; if the parent is <tt>null</tt> the path of the class loader
* built-in to the virtual machine is searched. That failing, this method
* will invoke {@link #findResource(String)} to find the resource. </p>
*
* @apiNote When overriding this method it is recommended that an
* implementation ensures that any delegation is consistent with the {@link
* #getResources(java.lang.String) getResources(String)} method.
*
* @param name
* The resource name
*
* @return A <tt>URL</tt> object for reading the resource, or
* <tt>null</tt> if the resource could not be found or the invoker
* doesn't have adequate privileges to get the resource.
*
* @since 1.1
*/
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}
先找父类加载器的资源,再找子类的
public InputStream loadClassPathResourceAsStream(final String name) throws IOException {
/*
* Don't use getResourceAsStream to avoid reusing connections between threads
* See https://github.com/pmd/pmd/issues/234
*/
final URL resource = classLoader.getResource(name);
if (resource == null) {
// Don't throw RuleSetNotFoundException, keep API compatibility
return null;
} else {
final URLConnection connection = resource.openConnection();
// This avoids reusing the underlying file, if the resource is loaded from a Jar file.
// The file is closed with the input stream then thus not leaving a leaked resource behind.
// See https://github.com/pmd/pmd/issues/364 and https://github.com/pmd/pmd/issues/337
connection.setUseCaches(false);
return connection.getInputStream();
}
}