【问题标题】:Difference between getClass().getClassLoader().getResource() and getClass.getResource()?getClass().getClassLoader().getResource() 和 getClass.getResource() 的区别?
【发布时间】:2013-01-22 06:28:33
【问题描述】:

getClass().getClassLoader().getResource()getClass.getResource() 有什么区别?

从资源中检索文件时,在什么情况下应该使用哪一个?

【问题讨论】:

  • 基本上(来自@Reimeus 链接的问题)相对路径查找的工作方式。 Class.getResource 相对于类的包查找它,而 ClassLoader.getResource 没有。

标签: java


【解决方案1】:

第二个调用第一个。 javadoc中描述了差异。

第一个采用不以/ 开头的路径,并且始终从类路径的根目录开始。

第二个路径可以以/ 开头。如果是这样,它将从类路径的根目录开始。如果不是,则从调用该方法的类的包开始。

所以getClass().getClassLoader().getResource("foo/bar.txt") 等价于getClass().getResource("/foo/bar.txt")

并且,假设 getClass() 返回包中的类 foogetClass().getResource("bar.txt") 等价于 getClass().getClassLoader().getResource("foo/bar.txt")

【讨论】:

    【解决方案2】:

    在什么情况下我应该使用哪一个?

    两者都不是。你应该打电话给Thread.currentThread().getContextClassLoader()

    这样做的好处是不需要根据您是从静态方法还是实例方法调用而进行更改。

    更重要的是,它将正确处理容器内的类加载器委托。如果您不使用它,您可能会发现找不到“应用程序”资源,因为加载它的类是由委托层次结构更高的类加载器加载的。

    【讨论】:

      【解决方案3】:

      基本上,Class.getResource() 允许您指定相对于类的包的路径,而ClassLoader.getResource() 始终是“绝对”路径。

      所以:

      foo.bar.Baz.class.getResource("data.txt")
      

      相当于:

      some.Other.class.getResource("/foo/bar/data.txt")
      

      它们都等价于:

      some.Other.class.getClassLoader().getResource("foo/bar/data.txt")
      

      (当然,假设some.Otherfoo.bar.Baz 是由同一个类加载器加载的。)

      【讨论】:

        猜你喜欢
        • 2017-08-12
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 2013-01-13
        • 2016-05-27
        相关资源
        最近更新 更多