Class.getResource和ClassLoader.getSystemResource:有选择一个而不是另一个的理由吗?

41
我看到Java中同时使用了Class.getResource和ClassLoader.getSystemResource来定位资源。有没有理由更喜欢其中一个?
4个回答

51

有几种加载资源的方法,每种方法略有不同的含义 -

ClassLoader::getSystemResource() 使用系统类加载器。这使用启动程序时使用的类路径。如果您在像Tomcat这样的Web容器中,则无法从WAR文件中获取资源。

Class<T>#getResource() 将类的包名称前缀添加到资源名称中,然后委托给其类加载器。 如果您的资源存储在模拟您的类的包层次结构中,请使用此方法。

ClassLoader#getResource() 委托给其父类加载器。 这将最终一直搜索资源到系统类加载器。

如果您感到困惑,请坚持使用ClassLoader#getResource()


4

Class.getResource()方法:

该方法将调用其类加载器,在对资源名称进行以下更改后进行委派:如果资源名称以“/”开头,则不会更改;否则,将包名称添加到将“.”转换为“/”后的资源名称之前。如果此对象是由引导加载程序加载的,则将调用委托给ClassLoader.getSystemResource

ClassLoader.getSystemResource()方法:

从用于加载类的搜索路径中查找指定名称的资源。此方法通过系统类加载器定位资源。


一个好的答案应该包括如何发现资源位置的信息。 - aminorex

0

ClassLoader.getSystemResource()将使用引导(系统)类加载器。

Class.getResource()将使用Class的特定实例的类加载器,换句话说,用于加载该类的任何类加载器。这可能是与系统类加载器不同的类加载器。


0

使用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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接