Java getClass().getClassLoader().getResource()和getClass.getResource()之间的差异?

Java getClass().getClassLoader().getResource()和getClass.getResource()之间的差异?,java,Java,getClass().getClassLoader().getResource()和getClass.getResource()之间有什么区别 从资源中检索文件时,在什么情况下应该使用哪种路径?基本上,Class.getResource()允许您指定相对于类的包的路径,而ClassLoader.getResource()始终是“绝对”路径 因此: 相当于: some.Other.class.getResource("/foo/bar/data.txt") some.Other.class.ge

getClass().getClassLoader().getResource()
getClass.getResource()
之间有什么区别


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

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

因此:

相当于:

some.Other.class.getResource("/foo/bar/data.txt")
some.Other.class.getClassLoader().getResource("foo/bar/data.txt")
它们都相当于:

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

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

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

第一个路径不以
/
开头,而是始终从类路径的根开始

第二条路径可以以
/
开头。如果是,则从类路径的根开始。如果不是,则从调用该方法的类的包开始

因此
getClass().getClassLoader().getResource(“foo/bar.txt”)
相当于
getClass().getResource(“/foo/bar.txt”)

并且,假设getClass()返回包
foo
中的类,
getClass().getResource(“bar.txt”)
相当于
getClass().getClassLoader().getResource(“foo/bar.txt”)

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

都不是。您应该调用
Thread.currentThread().getContextClassLoader()

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

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

基本上(从问题@Reimeus链接中)查看相对路径查找的工作方式
Class.getResource
相对于类的包查找它,而
ClassLoader.getResource
不查找它。