为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2019-06-21 17:24:51
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()..但显然不是。有人能给我一些关于这件事的启示吗?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-06-21
?
达令说

TA贡献1821条经验 获得超6个赞

第一个调用相对于.class文件,而后者相对于类路径根进行搜索。

为了调试类似的问题,我打印URL:

System.out.println( getClass().getResource(getClass().getSimpleName() + ".class") );


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 1421 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信