private string resolvename(string name) {
if (name == null) {
return name;
}
if (!name.startswith("/")) {
class<?> c = this;
while (c.isarray()) {
c = c.getcomponenttype();
}
string basename = c.getname();
int index = basename.lastindexof('.');
if (index != -1) {
name = basename.substring(0, index).replace('.', '/')
+"/"+name;
}
} else {
name = name.substring(1);
}
return name;
}
下面我把这个源码讲的内容翻译人类语言:
给任意一个字符串name,如果该name是以/开始的,则该函数返回的是:去掉/这个字符的字符串。(如name="/ouyangfeng" 则调用该函数之后得到的结果是:name=ouyangfeng)。
如果该name这个字符串不是以/开始的,则该函数返回的结果是调用这个函数类所在的包名+name组成的字符串(例如假设test5所在的包名是:com.qls.mount 。则:test5.class.resolvename("ouyangfeng");返回结果是:com/qls/mount/ouyangfeng)
也就是帮助文档讲述的:
if the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
otherwise, the absolute name is of the following form:modified_package_name/name
where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').
上述英文我简要翻译一下:如果name是以一个/开头,则这个资源的绝对name就是:name中/之后的部分内容。否则:这这个绝对name就是如下形式。包名/name,把这里包名中的.用/代替掉。【如:com.qls.river把.用/代替掉就是:com/qls/river】
然后我们再看看class类中的getresourceasstream(string name)的源码和classloader中的getresourceasstream(string name)中的源码。
class类中的getresourceasstream(string name)的源码如下:
public inputstream getresourceasstream(string name) {
name = resolvename(name);//注意这里有一个resolvename(string name)方法,根据上述的分析,易知道这个源码的意思.
classloader cl = getclassloader0();
if (cl==null) {
// a system class.
return classloader.getsystemresourceasstream(name);
}
return cl.getresourceasstream(name);
}