首页 >Java >java教程 >Class.getResource() 与 ClassLoader.getResource():资源加载的主要区别是什么?

Class.getResource() 与 ClassLoader.getResource():资源加载的主要区别是什么?

DDD
DDD原创
2025-01-01 13:13:11506浏览

Class.getResource() vs. ClassLoader.getResource(): What's the Key Difference in Resource Loading?

Class.getResource() 和 ClassLoader.getResource() 之间的区别

Class.getResource() 和 ClassLoader.getResource() 都是用于获取与类关联的资源。然而,它们的行为有细微的差别。

Class.getResource() 接受的资源名称可以是相对的也可以是绝对的。相对资源名称是相对于类的包进行解释的。另一方面,ClassLoader.getResource() 始终将资源名称视为绝对名称。

为了说明这种差异:

// Find the resource "xyz.txt" relative to the class's package
String resource1 = foo.bar.Baz.class.getResource("xyz.txt").getPath();

// Find the resource "xyz.txt" absolutely
String resource2 = foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt").getPath();

在这种情况下,resource1 将引用文件“xyz.txt”。 txt”包中的“foo.bar”,而resource2将引用相同的文件,但使用绝对路径。

在目录列表中缓存

您对目录列表中缓存的观察是正确的。目录列表缓存在 Class 对象中。这意味着在使用 Class.getResource() 时,加载类后对目录结构所做的任何更改都不会反映出来。

此行为记录在 Class API 文档中的“getResource”方法下:

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

附加说明

正如您发现的,使用 ClassLoader.getResource() 将允许您访问新创建的文件。这是因为 ClassLoader 不缓存目录列表,因此它将始终反映文件系统的当前状态。

以上是Class.getResource() 与 ClassLoader.getResource():资源加载的主要区别是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn