作者:狂放不羁
网址:http://yuquan.blog.51cto.com/
>>>转载请注明出处!<<<

一:分类

Java中的类加载器可以分为四类:

1 Bootstrp loader

Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类。

2 ExtClassLoader 

   Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext中的jar文档,以及此路径下的所有classes目录。

3 AppClassLoader

  Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档。

4 URLClassLoader

    URLClassLoader是我们可以自定义的加载器,我们可以通过指定一个URL对象来创建此加载器,它所加载路径就是URL所代表的逻辑位置。并且它的父加载器是AppClassLoader。
 
(*注意:某个加载器的父加载器与加载它的加载器没有联系,父加载器是按照规定的规则指定的)

二:委托模型

   所谓委托模型就是指:当一个加载器在加载某个类的时候先让父加载器去加载,父加载器再让其父加载器加载,依此类推,如果所有的父加载器都不能加载,再由自己来加载,而如果此时自己也不能加载,则产生java.lang.NoClassDefFoundError错误。
   委托模型最大的好处就是提高了java的安全性,比如:如果加载器的父加载器已经加载了某个类,那么自己就不能再加载此类了,这样就使得一些与java类库中同名的类不能加载进来。
三:ClassLoader以及Class
   我们都知道java中的每个类(包括接口)编译后都会生成一个.class文件,当.class文件被加载器加载到内存中后,就会生成一个Class对象的实例,此实例有一个指向加载它自己的加载器的实例引用。而我们每个类的实例都会有一个指向此实例所对应的类的Class对象。并且值得我们注意的是如果一个类被不同的加载器加载,那么对于每个类加载器来说类的静态初始化块都要执行。