getResourceAsStream class vs getClass()



我正在维护一段代码,我不确定条件。

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. class之间真的有区别吗?getresourcestream this.getClass()。getResourceAsStream ?

TIA

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

是的,当然。

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

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

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

长话短说:不同的类可以由不同的类加载器加载,每个类加载器都可以访问不同的文件集。如果StorageClassthis是由不同的类加载器加载的,那么一个调用将返回null而另一个调用成功是完全可能的。

最好的全面方法如下:

Thread.currentThread().getContextClassLoader().getResourceAsStream("/absolute_path");
在一个简单的打包应用程序中,有些人认为这是多余的。它真正有用的地方是在web应用程序中,应用程序的不同部分可能由不同的类加载器加载。

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

最新更新