【问题标题】:When using Class.getResource() and ClassLoader.getResource() [duplicate]当使用 Class.getResource() 和 ClassLoader.getResource() [重复]
【发布时间】:2021-05-03 20:09:31
【问题描述】:

刚刚学习了Java获取资源的方法,看到我们可以使用getResource()通过两种方式获取资源。

Class.getResource()

ClassLoader.getResource()

我很困惑我们什么时候使用Class.getResource(),什么时候使用ClassLoader.getResource()

有人对此有什么看法吗?

【问题讨论】:

  • 谢谢,但似乎参考文献讨论了用法上的差异。不提什么情况我们应该使用 Class.getResource() 和 ClassLoader.getResource()
  • 应该避免使用getClass().getResource(relativePath),而使用MyClass.getResource,因为类可以被覆盖,从而使相对路径失效。没有真正的区别,所以 Class#getResource 更短。请注意,ClassLoader 只有绝对路径,没有开始 /。

标签: java


【解决方案1】:

始终是ClassLoader,它最终完成了找到资源并使其可用于您的代码的工作。但是您不一定可以立即访问ClassLoader 实例。如果你这样做了,并且你知道这是正确的 ClassLoader 使用,那么你应该继续通过调用 getResource() 方法直接使用它。

使用<Class instance>.getResource() 通常是一种更直接、更“聪明”的方式来获得你想要的行为。它做了许多不同的事情来确定正确的ClassLoader 用于进行查找。然后它最终调用<ClassLoader instance>.getResource() 或其表亲方法之一(如ClassLoader.getSystemResource())来查找资源。由于您始终可以访问 A 类,并且您通常可以访问与资源相关联的 THE 类,因此调用 <Class instance>.getResource() 并让系统找到合适的 ClassLoader 使用会更方便。

注意:在不涉及模块的情况下,<Class instance>.getResource() 通常等同于<Class instance>.getClassLoader().getResource()。但并非所有类都有关联的ClassLoader。如果类本身没有关联的ClassLoader,则调用Class 版本的getResource() 将使用系统ClassLoader

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2012-10-27
    • 1970-01-01
    • 2015-04-01
    • 2016-03-26
    • 2017-07-04
    • 2016-08-26
    相关资源
    最近更新 更多