Class.getResource和ClassLoader.getSystemResource:是否有理由相互选择?
我看到Class.getResource
和ClassLoader.getSystemResource
用于在Java中定位资源。 有什么理由喜欢彼此吗?
有几种方法可以加载资源,每种方法的含义都略有不同 –
ClassLoader::getSystemResource()
使用系统类加载器。 这使用用于启动程序的类路径。 如果您位于诸如tomcat之类的Web容器中,则不会从WAR文件中获取资源。
Class
将类的包名称添加到资源名称,然后委托给它的类加载器。 如果资源存储在镜像类的包层次结构中,请使用此方法。
ClassLoader#getResource()
委托给它的父类加载器。 这将最终搜索资源一直到系统类加载器。
如果你感到困惑,只需坚持使用ClassLoader#getResource()
来自Class.getResource( )
在对资源名称进行这些更改后,此方法将调用委托给其类加载器:如果资源名称以“/”开头,则它保持不变; 否则,在转换“。”之后,包名称将被添加到资源名称之前。 至 ”/”。 如果此对象由引导加载程序加载,则该调用将委派给
ClassLoader.getSystemResource
。
和ClassLoader.getSystemResource( )
从用于加载类的搜索路径中查找指定名称的资源。 此方法通过系统类加载器定位资源
ClassLoader.getSystemResource()
将使用bootstrap(系统)类加载器。
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); }