java - Class.getResource() 和 ClassLoader.getResource() 有什么区别?

标签 java classloader getresource

我想知道 Class.getResource()ClassLoader.getResource() 有什么区别?

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

AFAIK 以下应该基本上做同样的事情,但他们不是:

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

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

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

来自 API docs关于 Class.getResource()

Finds a resource with a given name. The rules for searching resources associated with a given class are implemented by the defining class loader of the class. This method delegates to this object's class loader. If this object was loaded by the bootstrap class loader, the method delegates to 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");

关于java - Class.getResource() 和 ClassLoader.getResource() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608795/

相关文章:

java - Java 中的某些 BigDecimal 数在除法时会导致抛出 ArithmeticException

java - 正确使用 Classloader(尤其是在 Android 中)

java - getClass().getResource() 异常?

Java - 复制 Jar 文件夹

java - 如何消除对 Java 枚举值的依赖?

android - 我不能动态地执行 getResources.getString 吗?

java - 使用 SouceDataLine 播放时生成的声音模糊

java - 获取/usr/bin/ld : cannot find -ljvm collect2: ld returned 1 exit status make: *** [hello_world] Error 1 while trying to call java class method

Java unicode 在哪里可以找到示例 N 字节 unicode 字符

java - 在tomcat集群环境中获取ClassNotFoundException反序列化 session 属性