我看到Java中同时使用了Class.getResource和ClassLoader.getSystemResource来定位资源。有没有理由更喜欢其中一个?
有几种加载资源的方法,每种方法略有不同的含义 -
ClassLoader::getSystemResource()
使用系统类加载器。这使用启动程序时使用的类路径。如果您在像Tomcat这样的Web容器中,则无法从WAR文件中获取资源。
Class<T>#getResource()
将类的包名称前缀添加到资源名称中,然后委托给其类加载器。 如果您的资源存储在模拟您的类的包层次结构中,请使用此方法。
ClassLoader#getResource()
委托给其父类加载器。 这将最终一直搜索资源到系统类加载器。
如果您感到困惑,请坚持使用ClassLoader#getResource()
。
该方法将调用其类加载器,在对资源名称进行以下更改后进行委派:如果资源名称以“/”开头,则不会更改;否则,将包名称添加到将“.”转换为“/”后的资源名称之前。如果此对象是由引导加载程序加载的,则将调用委托给
ClassLoader.getSystemResource
。
和ClassLoader.getSystemResource()
方法:
从用于加载类的搜索路径中查找指定名称的资源。此方法通过系统类加载器定位资源。
ClassLoader.getSystemResource()
将使用引导(系统)类加载器。
Class.getResource()
将使用Class
的特定实例的类加载器,换句话说,用于加载该类的任何类加载器。这可能是与系统类加载器不同的类加载器。
使用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);
}