关于类加载方法之间的区别的流行答案,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().
显然不是。
由类加载器来name解释getResource(name)。
检查了源码URLClassLoader,最终调用了
这里重要的是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)
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |