Class.getResource and ClassLoader.getSystemResource: is there a reason to prefer one to another?

后端 未结 4 2078
借酒劲吻你
借酒劲吻你 2020-12-04 16:40

I saw both Class.getResource and ClassLoader.getSystemResource used to locate a resource in Java. Is there any reason to prefer one to another?

相关标签:
4条回答
  • 2020-12-04 17:14

    ClassLoader.getSystemResource() will use the bootstrap (system) classloader.

    Class.getResource() will use that particular instance of Class's classloader, in other words whatever classloader was used to load that class. This may be a different classloader than the system classloader.

    0 讨论(0)
  • 2020-12-04 17:19

    There are several ways to load resources, each with a slightly different meaning -

    ClassLoader::getSystemResource() uses the system classloader. This uses the classpath that was used to start the program. If you are in a web container such as tomcat, this will NOT pick up resources from your WAR file.

    Class<T>#getResource() prepends the package name of the class to the resource name, and then delegates to its classloader. If your resources are stored in a package hierarchy that mirrors your classes, use this method.

    ClassLoader#getResource() delegates to its parent classloader. This will eventually search for the resource all the way upto the system classloader.

    If you are confused, just stick to ClassLoader#getResource()

    0 讨论(0)
  • 2020-12-04 17:23

    Using Methods of 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);
    }
    
    0 讨论(0)
  • 2020-12-04 17:28

    From Class.getResource( )

    This method delegates the call to its class loader, after making these changes to the resource name: if the resource name starts with "/", it is unchanged; otherwise, the package name is prepended to the resource name after converting "." to "/". If this object was loaded by the bootstrap loader, the call is delegated to ClassLoader.getSystemResource.

    and ClassLoader.getSystemResource( )

    Find a resource of the specified name from the search path used to load classes. This method locates the resource through the system class loader

    0 讨论(0)
提交回复
热议问题