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