classLoader即类加载器,顾名思义,作用是用来加载java类的。
jvm中有三个加载器,分别是bootstrap ClassLoader,Extention ClassLoader,appClassLoader,前者依次是后者的parent,
但bootstrap由于是用C++写的,并不是以java类型存在的,所以打印出来是null。这三个加载器分工不同,bootstrap主要用来加载java的核心类,如java.*, javax.*下的类,以及jre中rt.jar和charset.jar。extention 则用来加载扩展类,如java.ext.dirs下的类。appclassLoader则用来加载应用类(classpath下)。
加载模型是双亲委派模式。当用一个类加载器来加载某个类时,先用该类的父加载器来加载,没有加载到,再从该加载器的类路径中找需要加载的该类。(同一个类用不同的加载器加载进来,在jvm中是不同的类)。
ClassLoader是一个抽象类,除了bootStrap,其他的classLoader都是其子类。其中的loadClass方法这样的:
1.该方法需要加锁,根据该classLoader类是否具有并行能力来决定加this还是特定className的锁。
2.先判断该类是否已经加载:findLoadedClass(className),若已加载,则直接返回(如不需要解析的话);
3.没加载,则判断该类的parent是否为null,为null,则用bootstrap来加载,不为null,则用parent的loadClass(className);
4.若父类未加载成功,则用该类的findClass来加载。
5.根据方法传进来的另一参数来决定是否解析。
java装载类是用的“全盘责任委托机制”。即当一个加载器加载某个类时,该类中所有依赖的,引用的类都由该加载器来加载(除非显式声明)。