ClassLoader 抽象类
同一个类的来自不同ClassLoader的子类的类会出现转型失败的情况,要注意。
loadClass
线程安全
1.findLoadedClass(name) 查找该类是否已经加载。
2.如果尚未加载,则执行3
3.判断该类的父类是否加载,如果尚未加载,递归调用loadClass(name,false);
4.如果父类已经加载,则findBootstrapClass0();
5.如果依旧未能加载,则直接按序调用findClass(name);
6.最后进行resolve,检查是否已经初始化并给出报错信息。(如果resolve=true ,否则不进行处理)
//源码
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;