不同的ClassLoader加载类的方式有所不同,通过双亲委派机制让不同的ClassLoader相互协作,形成一个整体。
首先先从Custom ClassLoader开始查找是否加载过该类,如果加载过,直接返回,如果没有加载过,委派给parent类,让parent查找是否加载过该类。一直到Bootstrap ClassLoader,如果还是没有加载过该累。则开始自顶而下尝试加载类,加载到类时,保存在对应的ClassLoader中并返回。
源码:
看下当前的classLoader是否加载过类,加载过直接返回。没有加载过,交给parent加载(Custom ClassLoader的parent->AppClassLoader的parent->ExtClassLoader的parent-> Bootstrap ClassLoader)
Parent为空,说明当前的loader是Custom ClassLoader,是C++编写的代码
找findBootstrapClass方法的实现代码:
为什么要使用双亲委派机制去加载类?
避免多份同样字节码的加载。内存是宝贵的,没必要保存两份相同的类对象。使用委托机制,在加载类对象时,就会从ClassLoader开始,逐层向父类查找,看看哪一个ClassLoader装载过这个类。
比如类A和类B都要使用System对象,类A第一次在Bootstrap ClassLoader装载了System对象,类B就直接从Bootstrap ClassLoader中获取已经装载了的System对象,无需再在内存中再装载一次System对象。