getClass().getClassLoader().getResource()
和 和有什么不一样getClass.getResource()
?
从资源中检索文件时,在什么情况下应该使用哪一个?
getClass().getClassLoader().getResource()
和 和有什么不一样getClass.getResource()
?
从资源中检索文件时,在什么情况下应该使用哪一个?
第二个调用第一个。javadoc中描述了差异。
第一个采用不以 a/
开头的路径,并且始终从类路径的根目录开始。
第二个采用可以以 . 开头的路径/
。如果是这样,它将从类路径的根目录开始。如果不是,它从调用该方法的类的包开始。
所以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()
。
这样做的好处是不需要根据您是从静态方法还是实例方法调用而进行更改。
And more important, it will properly handle classloader delegation inside a container. If you don't use it, you might find that an "application" resource isn't found because the class that's loading it was loaded by a classloader higher up the delegation hierarchy.
基本上,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.Other
和foo.bar.Baz
由同一个类加载器加载,当然。)