繁体   English   中英

加载.jar资源时使用ClassLoader

[英]Using ClassLoader when loading .jar resources

我只是不明白为什么使用ClassLoader会导致这两种情况的行为有所不同。 有人可以解释ClassLoader如何/为什么更改搜索,以使其需要进入jar的完整路径?

package com.example;
import java.io.InputStream;

public class SomeClass {
  private static InputStream stm;
  static {
    for (final String s : new String[] { "file.png", "com/example/file.png", "/com/example/file.png" }) {
      // case 1 - w/o classLoader
      stm = SomeClass.class.getResourceAsStream(s);
      System.out.println("w/o          : " + (stm == null ? "FAILED to load" : "loaded") + " " + s);

      // case 2 - w/ classLoader
      stm = SomeClass.class.getClassLoader().getResourceAsStream(s);
      System.out.println("w/classloader: " + (stm == null ? "FAILED to load" : "loaded") + " " + s);
    }
  }

  public static void main(final String args[]) {}
}

生产:

w/o          : loaded file.png
w/classloader: FAILED to load file.png
w/o          : FAILED to load com/example/file.png
w/classloader: loaded com/example/file.png
w/o          : loaded /com/example/file.png
w/classloader: FAILED to load /com/example/file.png

因为根据您调用的getResourceAsStream()方法,对路径的评估有所不同。
如果在com.example.SomeClass类上调用Class.getResourceAsStream() ,则如果路径不是以/开头,则相对于SomeClass评估路径,因此file.png变为/com/example/file.pngcom/example/file.png变成/com/example/com/example/file.png
如果在其ClassLoader上调用ClassLoader.getResourceAsStream() ,则该路径是隐式绝对的,并且不能以/开头,因此file.png变为/file.png com/example/file.png变为/com/example/file.png
如果您使用/com/example/file.pngClass的绝对路径,则必须使用Class方法。

不幸的是, ClassLoader.getResourceAsStream()这种隐式绝对性仅在Class.getResourceAsStream()的文档中进行了隐式记录,该文档指出,它在委托给其ClassLoader的方法之前先去除了斜杠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM