getResourceAsStream 与不使用 getClassLoader 有什么区别?
2022-09-04 19:41:58
我想知道以下两者之间的区别:
MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");
和
MyClass.class.getResourceAsStream("path/to/my/properties");
谢谢。
我想知道以下两者之间的区别:
MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");
和
MyClass.class.getResourceAsStream("path/to/my/properties");
谢谢。
From the Javadoc for Class.getResourceAsStream()
:
此方法委托给此对象的类装入器。在委派之前,使用以下算法从给定的资源名称构造绝对资源名称:
- 如果 以 “/” ('\u002f' ) 开头,则资源的绝对名称是名称中“/”后面的部分。
name
- 否则,绝对名称采用以下形式:
其中modified_package_name是此对象的包名称,其中“/”替换为“”。(“\u002e”)。modified_package_name/name
换句话说,如果“path”以“/”开头,它们会做同样的事情,但如果不是,那么在后一种情况下,路径将相对于类的包,而classloader的路径将是绝对的。
简而言之,第一个抓取和第二个抓取 。path/to/my/properties
package/of/myclass/path/to/my/properties
从文档中:Class.getClassLoader()
返回类的类装入器。某些实现可能使用 null 来表示引导类装入器。如果此类是由引导类装入器装入的,则此方法将在此类实现中返回 null。
因此,如果类是由引导类装入器装入的,则可能会返回,因此在实现中进行空检查:getClassLoader()
null
Class.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);