Class.getResource和ClassLoader.getSystemResource:有理由相互选择吗?

时间:2011-06-09 19:49:10

标签: java resources

我看到Class.getResourceClassLoader.getSystemResource用于在Java中查找资源。有什么理由喜欢彼此吗?

4 个答案:

答案 0 :(得分:36)

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

ClassLoader::getSystemResource()使用系统类加载器。这使用用于启动程序的类路径。如果您位于诸如tomcat之类的Web容器中,则不会从WAR文件中获取资源。

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

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

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

答案 1 :(得分:3)

来自Class.getResource( )

  

此方法将调用委托给它   类加载器,制作完成后   更改资源名称:如果是   资源名称以“/”开头,它是   不变;否则,包名称   预先附加到资源名称   转换后“。”至 ”/”。如果这   对象是由引导程序加载的   加载器,调用委托给   ClassLoader.getSystemResource

ClassLoader.getSystemResource( )

  

查找指定名称的资源   从用于加载的搜索路径   类。这个方法找到了   资源通过系统类   装载机

答案 2 :(得分:0)

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

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

答案 3 :(得分: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);
}