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
不查找它。