【问题标题】:why ClassLoader.getResource("/pkg/readme.txt") always return null with resource name with a leading slash?为什么 ClassLoader.getResource("/pkg/readme.txt") 总是返回带有前导斜杠的资源名称的 null?
【发布时间】:2013-12-20 23:15:50
【问题描述】:

我google了很多,但还是不明白 为什么 ClassLoader.getResource("/pkg/readme.txt") 总是返回 null? 否则,如果没有前导斜杠,ClassLoader.getResource("pkg/readme.txt") 可以返回正确的 URL。

我确实了解 Class 和 ClassLoader 中这些方法之间的区别。

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

【问题讨论】:

    标签: java


    【解决方案1】:

    我担心ClassLoader.getResource() 不适用于以斜杠开头的资源名称

    这是因为没有以斜杠开头的资源名称。根据定义,资源名称是“一个 '/' 分隔的路径名,用于标识资源” - 组件由 斜杠分隔,而不是在它们之前

    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中)

    【讨论】:

    • 感谢您的回复。
    • 正如我所说,我确实了解 Class 和 ClassLoader 之间的差异。我确实了解您所说的。但我的问题是为什么 ClassLoader.getResource("/pkg/readme.txt") 不能与前导斜杠一起使用。
    • @FengXi 因为这是语言设计者在设计此机制时所决定的。如果你想知道为什么,你必须问他们。没有名为/pkg/readme.txt 的资源,只有pkg/readme.txt
    【解决方案2】:

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

    在完成这些之后,此方法将调用委托给其类加载器 资源名称变化:如果资源名称以“/”开头,则 不变;否则,包名称会附加到资源中 转换“。”后的名称到 ”/”。如果这个对象是由 引导加载程序,调用委托给 ClassLoader.getSystemResource.

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

    【讨论】:

    • 谢谢。我不是在问 Class.getResource() 和 ClassLoader 之间的差异。我只想知道为什么 ClassLoader.getResource 不适用于以斜杠开头的资源名称。
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 2015-11-16
    • 2023-04-10
    • 2014-09-12
    • 2019-09-18
    • 2014-09-02
    • 2015-02-27
    • 2021-01-10
    相关资源
    最近更新 更多