为什么ClassLoader.getResource(“/ pkg / readme.txt”)总是返回null,资源名称带有前导斜杠?

时间:2013-12-04 12:49:19

标签: java

我搜索了很多但仍然不明白 为什么ClassLoader.getResource(“/ pkg / readme.txt”)总是返回null? 如果没有前导斜杠,ClassLoader.getResource(“pkg / readme.txt”)可以返回正确的URL。

我理解Class和ClassLoader中这些方法之间的差异。

注意:我不是在问Class.getResource()和ClassLoader.getResource()之间的差别,因为我明白了。我关注的是ClassLoader.getResource()不适用于以前导斜杠开头的资源名称

2 个答案:

答案 0 :(得分:1)

  

我关注ClassLoader.getResource()对于以前导斜杠开头的资源名称不起作用

那是因为没有以前导斜杠开头的资源名称。根据定义,资源名称是“a'/' - 标识资源的分隔路径名” - 组件斜杠分隔,而不是开头。

someClass.getResource("/pkg/readme.txt")相当于someClass.getClassLoader().getResource("pkg/readme.txt"),前导斜杠是资源名称的一部分,而是指示Class.getResource它应该将类的包添加到它传递给类加载器的路径中。没有领先的斜杠:

someClass.getResource("pkg/readme.txt")

等同于

someClass.getClassLoader().getResource("com/example/pkg/readme.txt")

(假设someClass包含在com.example

答案 1 :(得分:1)

Class的getResource() - 文档说明了区别:

  

这个方法在调用之后将调用委托给它的类加载器   更改资源名称:如果资源名称以“/”开头,则为   没有变化;否则,包名称将预先添加到资源中   转换后的名称“。”至 ”/”。如果这个对象是由   bootstrap loader,将调用委托给   ClassLoader.getSystemResource。

What is the difference between Class.getResource() and ClassLoader.getResource()?