getResourceAsStream 与不使用 getClassLoader 有什么区别?

2022-09-04 19:41:58

我想知道以下两者之间的区别:

MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");

MyClass.class.getResourceAsStream("path/to/my/properties");

谢谢。


答案 1

From the Javadoc for Class.getResourceAsStream()

此方法委托给此对象的类装入器。在委派之前,使用以下算法从给定的资源名称构造绝对资源名称:

  • 如果 以 “/” ('\u002f' ) 开头,则资源的绝对名称是名称中“/”后面的部分。name
  • 否则,绝对名称采用以下形式:
    其中modified_package_name是此对象的包名称,其中“/”替换为“”。(“\u002e”)。modified_package_name/name

换句话说,如果“path”以“/”开头,它们会做同样的事情,但如果不是,那么在后一种情况下,路径将相对于类的包,而classloader的路径将是绝对的。

简而言之,第一个抓取和第二个抓取 。path/to/my/propertiespackage/of/myclass/path/to/my/properties


答案 2

文档中Class.getClassLoader()

返回类的类装入器。某些实现可能使用 null 来表示引导类装入器。如果此类是由引导类装入器装入的,则此方法将在此类实现中返回 null。

因此如果类是由引导类装入器装入的,则可能会返回,因此在实现中进行空检查:getClassLoader()nullClass.getResourceAsStream

public InputStream getResourceAsStream(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResourceAsStream(name);
    }
    return cl.getResourceAsStream(name);
}

您还将注意到马克·彼得斯(Mark Peters)在他的答案中解释的陈述。name = resolveName(name);


推荐