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

Jim*_*y C 40 java

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

JB *_*zet 52

第二个叫第一个.差异在javadoc中描述.

第一个采用不以a /开头的路径,并始终从类路径的根开始.

第二个采取可以以a开头的路径/.如果是,则从类路径的根开始.如果不是,则从调用该方法的类的包开始.

所以getClass().getClassLoader().getResource("foo/bar.txt")相当于getClass().getResource("/foo/bar.txt").

并且,假定的getClass()返回一类是在包foo,getClass().getResource("bar.txt")是相当于getClass().getClassLoader().getResource("foo/bar.txt")


小智 23

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

都不是.你应该打电话Thread.currentThread().getContextClassLoader().

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

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


Jon*_*eet 11

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

所以:

foo.bar.Baz.class.getResource("data.txt")
Run Code Online (Sandbox Code Playgroud)

相当于:

some.Other.class.getResource("/foo/bar/data.txt")
Run Code Online (Sandbox Code Playgroud)

它们都相当于:

some.Other.class.getClassLoader().getResource("foo/bar/data.txt")
Run Code Online (Sandbox Code Playgroud)

(假设some.Otherfoo.bar.Baz用相同的类加载器加载的,当然.)