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

Java 类加载器资源路径总是绝对的?,java,classloader,Java,Classloader,Jon Skeet在一篇关于类加载方法之间差异的流行文章中指出 类加载器资源路径总是被认为是绝对的 一个更受欢迎的例子证实了这一说法 >代码>类加载器.GETRealSuffSturnScript(PATH)将考虑所有路径 绝对路径。这么叫 String.getClassLoader().getResourceAsString(“myfile.txt”)和 String.getClassLoader().getResourceAsString(“/myfile.txt”)将同时使用 在类路径中

Jon Skeet在一篇关于类加载方法之间差异的流行文章中指出

类加载器资源路径总是被认为是绝对的

一个更受欢迎的例子证实了这一说法

<> >代码>类加载器.GETRealSuffSturnScript(PATH)将考虑所有路径 绝对路径。这么叫
String.getClassLoader().getResourceAsString(“myfile.txt”)
String.getClassLoader().getResourceAsString(“/myfile.txt”)
将同时使用 在类路径中的以下位置查找文件:
/myfile.txt

忽略示例无法编译的事实,一致认为前导正斜杠与类加载器无关

一个简单的测试表明情况并非如此

Foo.class.getClassLoader().getResource(“test.xml”)//文件

Foo.class.getClassLoader().getResource(“/test.xml”)//null

我只是简单地将路径
files/test.xml
添加到测试项目的类路径中,其中一个名为
Foo
的类包含一个
main()
方法,该方法打印出这两个调用的结果。既然数百人投票支持上述答案,我还缺少什么?类加载器是绝对的,还是依赖于输入名称的结构


这有助于我的理解

最终从资源名称构造URL的方法是。

显然不是

由类加载器在
getResource(name)
中解释
name

检查
URLClassLoader
的源代码,最终调用

在这里,
name
是绝对的还是相对的很重要

对于某些
baseURL
,绝对
/foo/bar
和相对
foo/bar
可能具有相同的效果。特别是,类路径中的情况总是如此

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 

根据我的经验,资源的路径取决于你给予它什么。例如,
/myfile.txt
将查找
{classpath}/myfile.txt
,但是
myfile.txt
将查找
{classpath}/{class package path}/myfile.txt
,其中
{class package path}
是用于请求它的类的包路径,已经说过,它将根据您使用
getResource
的方式而变化,例如,执行类似
的操作。getResource(…)
将按所述工作,但执行类似
SomeClass.class的操作。getResource(…)
将不起作用(如果我正确,它将按所述工作).
ClassLoader
资源路径始终是绝对的,但前导的
/
无效,而不仅仅是多余的。@程序员您将
Class.getResource()
ClassLoader.getResource()
混淆了。后者无法知道程序包名称。@TavianBarnes,你能指出一些文档吗?@jaco0646我不知道有任何官方位置记录了这一点,除非通过艰苦地跟踪源代码。但这种行为永远是一贯的。我已经对类路径资源编写了一个完整的
java.nio.file.Path
抽象,只是为了让它们更适合使用。