Java Class.getResource和ClassLoader.getSystemResource:有没有理由选择其中一个而不是另一个?

Java Class.getResource和ClassLoader.getSystemResource:有没有理由选择其中一个而不是另一个?,java,resources,Java,Resources,我看到Class.getResource和ClassLoader.getSystemResource用于在Java中定位资源。有什么理由选择一个而不是另一个吗?类加载器。getSystemResource()将使用引导(系统)类加载器 Class.getResource()将使用Class的类加载器的特定实例,换句话说,使用任何类加载器加载该类。这可能是与系统类加载器不同的类加载器。 此方法将调用委托给其 类装入器,在完成这些 对资源名称的更改:如果 资源名称以“/”开头,它是 不变;否则,将显

我看到
Class.getResource
ClassLoader.getSystemResource
用于在Java中定位资源。有什么理由选择一个而不是另一个吗?

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

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

此方法将调用委托给其 类装入器,在完成这些 对资源名称的更改:如果 资源名称以“/”开头,它是 不变;否则,将显示包名 在资源名称前面加上 将“.”转换为“/”后。如果这 对象已由引导程序加载 加载程序,则调用被委派给
ClassLoader.getSystemResource

查找指定名称的资源 从用于加载的搜索路径 上课。此方法定位 通过系统类获取资源 装载机


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

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

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

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


如果您感到困惑,请使用java.lang.Class的方法坚持使用
ClassLoader#getResource()

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

一个好的答案应该包括关于如何发现哪里可以找到资源的信息