【发布时间】:2011-06-09 19:49:09
【问题描述】:
我看到Class.getResource 和ClassLoader.getSystemResource 都用于在Java 中定位资源。有什么理由比另一个更喜欢一个吗?
【问题讨论】:
我看到Class.getResource 和ClassLoader.getSystemResource 都用于在Java 中定位资源。有什么理由比另一个更喜欢一个吗?
【问题讨论】:
加载资源有多种方式,每一种的含义略有不同——
ClassLoader::getSystemResource() 使用系统类加载器。这使用用于启动程序的类路径。如果你在一个 web 容器中,比如 tomcat,这不会从你的 WAR 文件中获取资源。
Class<T>#getResource() 将类的包名添加到资源名中,然后委托给它的类加载器。如果您的资源存储在反映您的类的包层次结构中,请使用此方法。
ClassLoader#getResource() 委托给它的父类加载器。这最终会一直搜索到系统类加载器的资源。
如果你有困惑,请坚持ClassLoader#getResource()
【讨论】:
此方法将调用委托给它的 类加载器,在制作完这些之后 更改资源名称:如果 资源名称以“/”开头,它是 不变;否则,包名 附加到资源名称 转换“。”后到 ”/”。如果这 对象由引导程序加载 loader,调用委托给
ClassLoader.getSystemResource。
和ClassLoader.getSystemResource( )
查找指定名称的资源 从用于加载的搜索路径 类。该方法定位 通过系统类资源 装载机
【讨论】:
ClassLoader.getSystemResource() 将使用引导(系统)类加载器。
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);
}
【讨论】: