Class.getResource()和ClassLoader.getResource()之间有什么

Class.getResource()和ClassLoader.getResource()之间有什么区别?

我想知道Class.getResource()ClassLoader.getResource()?

编辑:我特别想知道在文件/目录级别是否涉及缓存。如“目录列表是否缓存在类版本中?”

AFAIK基本上应该这样做,但事实并非如此:

getClass().getResource() getClass().getClassLoader().getResource()

我在处理一些报表生成代码时发现了这一点,这些代码在WEB-INF/classes/从该目录中的现有文件中删除。当使用Class中的方法时,我可以使用getClass().getResource(),但是当尝试获取新创建的文件时,我收到了一个空对象。浏览目录可以清楚地显示新文件在那里。文件名前面加上一个正斜杠,如“/myFile.txt”。

这个ClassLoader版本getResource()另一方面,确实找到了生成的文件。从这一经验来看,目录列表似乎存在某种类型的缓存。我说的对吗?如果是的话,这份文件在哪里?

API文档在……上面Class.getResource()

查找具有给定名称的资源。用于搜索与给定类关联的资源的规则由类的定义类加载器实现。此方法委托给此对象的类加载器。如果此对象是由引导类加载器加载的,则该方法将委托给ClassLoader.getSystemResource(java.lang.String).。

对我来说,这是“Class.getResource实际上正在调用它自己的类加载器的getResource()”。这和做getClass().getClassLoader().getResource()..但显然不是。有人能给我一些关于这件事的启示吗?


回首忆惘然
浏览 1422回答 3
3回答

梦里花落0921

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

达令说

第一个调用相对于.class文件,而后者相对于类路径根进行搜索。为了调试类似的问题,我打印URL:System.out.println( getClass().getResource(getClass().getSimpleName() + ".class") );
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java