从JAVA虚拟机的角度来说,只有两种类型的类加载器:启动类加载器,由C++实现,是虚拟机自身的一部分;全部其余的类加载器,由java语言实现,独立于虚拟机外部,而且所有继承自java.lang.ClassLoader。java
从java开发人员的角度来看,通常是由三种类加载器线程
BootStrap ClassLoader设计
Exetension ClassLoader继承
Application ClassLoader开发
这里列加载器之间的父子关系通常不是继承关系,而是以组合关系来复用父加载器的代码。虚拟机
破坏双亲委派模型io
第一次被破坏发生在双亲委派模型出现以前,对已经存在的用户自定义类加载器的实现代码,java设计者引入双亲委派时不得不作出一些妥协。在java.lang.ClassLoader添加了一个新的protected findClass()方法,去重写loadClass()方法。基础
第二次是由自身的缺陷所致使的,双亲委派很好地解决了各个类加载器的基础类的同一问题,可是若是出现基础类又要调用回用户的代码时就要破坏该模型。引入了线程上下文类加载器。程序
第三次是因为用户对程序动态性的追求而致使的。方法