类加载器资源路径总是绝对的?

jac*_*646 5 java classloader

关于类加载方法之间的区别的流行答案,Jon Skeet表示,

类加载器资源路径始终被视为绝对路径.

一个更受欢迎的答案以一个例子肯定了这个陈述.

ClassLoader.getResourceAsStream(path)将所有路径视为绝对路径.所以调用 String.getClassLoader().getResourceAsString("myfile.txt")并将 String.getClassLoader().getResourceAsString("/myfile.txt")在以下位置的类路径中查找文件: ./myfile.txt.

忽略该示例不会编译的事实,共识表明前导斜杠与ClassLoader无关.

一个简单的测试显示不然.

Foo.class.getClassLoader().getResource("test.xml") // file
Foo.class.getClassLoader().getResource("/test.xml") // null

我只是添加了files/test.xml一个测试项目的类路径的路径,一个名为Foo包含一个main()方法的类打印出这两个调用的结果.我错过了什么,因为数百人已经投了上述答案?ClassLoader是绝对的,还是取决于输入名称的结构?


这篇Oracle博客文章对我的理解很有帮助.

最终从资源名称构造URL的方法是URLClassPath.JarLoader.checkResource().

Zho*_*gYu 1

显然不是。

由类加载器来name解释getResource(name)

检查了源码URLClassLoader,最终调用了

new URL(baseURL, name)

这里重要的是name绝对的还是相对的

baseURL对于某些人来说,绝对/foo/bar和相对可能foo/bar具有相同的效果。特别是,类路径中的“jar 文件 URL”始终是这种情况

baseURL:       jar:file:/home/duke/duke.jar!/

 foo/bar  ->   jar:file:/home/duke/duke.jar!/foo/bar 
/foo/bar  ->   jar:file:/home/duke/duke.jar!/foo/bar 
Run Code Online (Sandbox Code Playgroud)