getClass().getClassLoader().getResource() 和 getClass.getResource() 的区别?

Posted

技术标签:

【中文标题】getClass().getClassLoader().getResource() 和 getClass.getResource() 的区别?【英文标题】:Difference between getClass().getClassLoader().getResource() and getClass.getResource()? 【发布时间】:2013-01-22 06:28:33 【问题描述】:

getClass().getClassLoader().getResource()getClass.getResource() 有什么区别?

从资源中检索文件时,在什么情况下应该使用哪一个?

【问题讨论】:

见***.com/questions/676250/… 基本上(来自@Reimeus 链接的问题)相对路径查找的工作方式。 Class.getResource 相对于类的包查找它,而 ClassLoader.getResource 没有。 【参考方案1】:

第二个调用第一个。 javadoc中描述了差异。

第一个采用不以/ 开头的路径,并且始终从类路径的根目录开始。

第二个路径可以以/ 开头。如果是这样,它将从类路径的根目录开始。如果不是,则从调用该方法的类的包开始。

所以getClass().getClassLoader().getResource("foo/bar.txt") 等价于getClass().getResource("/foo/bar.txt")

并且,假设 getClass() 返回包中的类 foogetClass().getResource("bar.txt") 等价于 getClass().getClassLoader().getResource("foo/bar.txt")

【讨论】:

【参考方案2】:

在什么情况下我应该使用哪一个?

两者都不是。你应该打电话给Thread.currentThread().getContextClassLoader()

这样做的好处是不需要根据您是从静态方法还是实例方法调用而进行更改。

更重要的是,它将正确处理容器内的类加载器委托。如果您不使用它,您可能会发现找不到“应用程序”资源,因为加载它的类是由委托层次结构更高的类加载器加载的。

【讨论】:

【参考方案3】:

基本上,Class.getResource() 允许您指定相对于类的包的路径,而ClassLoader.getResource() 始终是“绝对”路径。

所以:

foo.bar.Baz.class.getResource("data.txt")

相当于:

some.Other.class.getResource("/foo/bar/data.txt")

它们都等价于:

some.Other.class.getClassLoader().getResource("foo/bar/data.txt")

(当然,假设some.Otherfoo.bar.Baz 是由同一个类加载器加载的。)

【讨论】:

以上是关于getClass().getClassLoader().getResource() 和 getClass.getResource() 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

getClass()和getClassLoader()区别 以及ClassLoader详解及用途(文件加载,类加载)

this.getclass ().getclassloader() .getresourceasstream(...)

Java:这个路径用class.getClassLoader().getResource()该怎么写呢?

Java中getClassLoader().getResource()和getResource()的区别

this.class.getClassLoader().getResourceAsStream与this.class.getResourceAsStream

java上传文件获取跟目录的办法