双亲委派
类加载是遵循双亲委派机制的,双亲委派机制是当一个类需要被加载时,加载器首先并不是自己直接加载,而是先从自己缓存中查找是否加载过,如果加载过直接返回。如果没有则上委托自己的父加载器加载,父加载器同样执行上述操作,以次类推。如果到最顶层的boostrapClassLoader也没有加载的话,将向下检查,查找并加载该类。这样一上一下的过程称为双亲委派。示意图如下:
为什么要使用双亲委派
安全问题。比如某人自己类库中有个类叫 java.lang.String 自定义加载时可以覆盖掉 jdk 中的 String 类,这样他可以在 String 类里动手脚。比如用户输入密码,用String存储的吧,可以在这里做一些操作记录下来密码,将造成密码泄漏。而有双亲委派,类首先去委托自己父加载器加载,java.lang.String永远都是jdk的String类,则不会出现密码泄漏的风险。
效率问题。试想一个类已经被加载了,还需要加载第二遍吗?加载一次,每次从缓存取将提高系统的效率。