1

我正在维护一段代码,但我不确定情况。

resourceStream = StorageEngine.class.getResourceAsStream(resourceFile);
if (resourceStream == null) {
    log.info("StorageEngine: didn't find  resource file in the classes root ");
    resourceStream = this.getClass().getResourceAsStream(resourceFile);
}

StorageEngine.class.getResourceAsStreamthis.getClass().getResourceAsStream之间真的有区别吗?

TIA

4

2 回答 2

1

StorageEngine.class.getResourceAsStream 和 this.getClass().getResourceAsStream 之间真的有区别吗?

是的,一点没错。

  • 如果资源名称是相对的,它将相对于包含相关类的包
  • 如果两个类在不同的类加载器中,一个可能能够访问资源而另一个不能

当然,如果thisStorageEngine(而不是子类)的实例,那么它们确实是等价的。

于 2013-06-20T15:32:07.220 回答
1

简短的回答:是的,但两者都不是真正的正确方法。

长答案:不同的类可能由不同的类加载器加载,每个类加载器都可以访问不同的文件集。如果StorageClass并且this由不同的类加载器加载,那么完全有可能一个调用将返回null而另一个调用成功。

最好的全方位方法如下:

Thread.currentThread().getContextClassLoader().getResourceAsStream("/absolute_path");

在一个简单的打包应用程序中,有些人认为这太过分了。它真正有用的地方是在 web 应用程序中,应用程序的不同部分可能由不同的类加载器加载。

IMO,您应该使用显式类加载的唯一一次是当您编写库代码并希望确保您获得特定资源的副本时这种情况极为罕见;通常,库想要使用应用程序打包的资源。

于 2013-06-20T15:39:18.107 回答