我想知道两者之间有什么区别Class.getResource()
and ClassLoader.getResource()
?
编辑:我特别想知道文件/目录级别是否涉及任何缓存。如“目录列表是否缓存在类版本中?”
据我所知,以下内容本质上应该做同样的事情,但事实并非如此:
getClass().getResource()
getClass().getClassLoader().getResource()
我在摆弄一些在其中创建新文件的报告生成代码时发现了这一点WEB-INF/classes/
从该目录中的现有文件。当使用类中的方法时,我可以使用以下命令找到部署时存在的文件getClass().getResource()
,但是当尝试获取新创建的文件时,我收到了一个空对象。浏览目录清楚地显示新文件就在那里。文件名前面带有正斜杠,如“/myFile.txt”中所示。
The ClassLoader
的版本getResource()
另一方面确实找到了生成的文件。从这次经验来看,似乎正在对目录列表进行某种缓存。我说得对吗?如果是的话,这个记录在哪里?
来自API docs on Class.getResource()
找到资源
具有给定的名称。规则为
搜索与某个相关的资源
给定的类由
定义类的类加载器。
该方法委托给该对象的
类加载器。如果这个物体是
由引导类加载器加载,
该方法委托给
ClassLoader.getSystemResource(java.lang.String)。
对我来说,这意味着“Class.getResource 实际上是在调用它自己的类加载器的 getResource()”。这与做的一样getClass().getClassLoader().getResource()
。但显然不是。有人可以为我提供一些关于此事的说明吗?
Class.getResource
可以采用“相对”资源名称,该名称是相对于类的包进行处理的。或者,您可以使用前导斜杠指定“绝对”资源名称。类加载器资源路径始终被认为是绝对的。
所以下面的内容基本上是等价的:
foo.bar.Baz.class.getResource("xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt");
这些也是如此(但它们与上面不同):
foo.bar.Baz.class.getResource("/data/xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)