classLoader中采用了父类委托模式,类加载器有三种:bootstrap classloader(爷爷)、Extclassloader(父亲)、APPclassloader。也可以自定义类加载器,可以加载指定文件夹下的类。
所谓父类委托模式就是,类加载器本身不去加载类,而是将加载任务交给父类加载器完成。
protected synchronized Class loadClass(String name, boolean resolve)
throws ClassNotFoundException{
// 首先检查该name指定的class是否有被加载
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
//如果parent不为null,则调用parent的loadClass进行加载
c = parent.loadClass(name, false);
}else{
//parent为null,则调用BootstrapClassLoader进行加载
c = findBootstrapClass0(name);
}
}catch(ClassNotFoundException e) {
//如果仍然无法加载成功,则调用自身的findClass进行加载
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
优点是安全(避免自定义类库代替核心类库)、避免重复加载。缺点就是单向的,委托永远是子加载器去请求父加载器,是单向的,即上层的类加载器无法访问下层的类加载器所加载的类。spi方式可以解决,循环迭代加载实现类。
classloader中比较重要的方法:loadclass、defineclass、forname、findsystemclass、resolveClass、findLoadedClass
findclass。