双亲委派机制
双亲委派就是一个从子到父的过程,然后还有一个从父到子的状态。具体如下:
如果一个类加载器收到了类加载的请求,它会首先去自己的缓存中查找是否加载过这个类(findLoadedClass),如果有,那么直接加载。如果没有就会让父加载器加载,父加载器会先去自己的缓存中查找是否加载过这个类,如果有直接加载,如果没有就会让父加载器加载,依次类推直到Bootstrap ClassLoader。
如果Bootstrap ClassLoader的缓存中没有,那么Bootstrap ClassLoader就会判断是不是该自己加载,如果是,那么自己就加载(loadClass),如果不是就会让子加载器进行加载。依次类推,直到加载到为止,如果到了自定义加载器还是加载不到,那么就会抛出class Not found异常。
双亲委派机制的好处
采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.String,不管是哪个类加载器加载这个类。最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个String对象。
下面我们通过一个例子来说明,我们创建一个String类,如下所示:
这个之所以会出问题是当我们运行String文件的时候,在加载的时候,根据委托机制会逐渐到BootStrap,由于rt.jar里面包含String,那么BootStr