类加载器
完成”通过一个全限定名来获取描述此类的二进制字节流“动作的代码模块叫做类加载器。
对于同一个类,需要由类加载器和这个类本身一桶确立其在Java虚拟机中的唯一性。每一个类加载器都有一个独立的类名称命名空间。换句话说,比较两个类是否相等,必须在这两个类是同一个类加载器加载的前提下,进行比较才有意义。否则,即使这两个类来自同一个class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类也必定不相等。
Bootstrap ClassLoader 启动类加载器
Extension ClassLoader扩展类加载器
Application ClassLoader应用程序类加载器
这里需要注意的是上述三个JDK提供的类加载器虽然是父子类加载器关系,但是没有使用继承,而是使用了组合关系。
从JDK1.2开始,java虚拟机规范推荐开发者使用双亲委派模式(ParentsDelegation Model)进行类加载,其加载过程如下:
(1).如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器去完成。
(2).每一层的类加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层的启动类加载器。
(3).如果顶层的启动类加载器无法完成加载请求,子类加载器尝试去加载,如果连最初发起类加载请求的类加载器也无法完成加载请求时,将会抛出ClassNotFoundException,而不再调用其子类加载器去进行类加载。
双亲委派 模式的类加载机制的优点是java类它的类加载器一起具备了一种带优先级的层次关系,越是基础的类,越是被上层的类加载器进行加载,保证了java程序的稳定运行。双亲委派模式的实现: