java中可以有多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader

类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。
BootStrap是存在于jvm内核中 由c++语言编写的
一.当Java虚拟机要加载一类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。(这不是静态方法,是ClassLoader的一个实例调用loadClass方法)
二.类加载器的委托机制
当一个类加载器需要加载一个类时,不会首先自己加载,而是委托给上级加载,上级在自己的目录下找不到该类,才会一级级往下.
当回到发起者时依然找不到该类 则会抛出 ClassNotFoundException
例如AppClassLoader要加载一个类,会首先委托给ExtClassLoader,ExtClassLoader再委托给BootStrap.
所以即使我们自己写了一个java.lang.System 但是加载时,因为委托机制,首先会由BootStrap去加载java系统提供的System类.
三.自定义类加载器
1.自定义的类加载器必须继承ClassLoader.
ClassLoader(ClassLoader parent)的构造函数中可以指定用于委托操作的父类加载器.也可以使用空参构造,那么会默认使用getSystemClassLoader()
返回的作为父类加载器
2.不需要复写loadClass()方法,只要复写findClass()方法即可.
因为loadClass()方法会执行委托加载的操作,如果复写了,则需要我们自己去定义委托加载.
在API的描述中也鼓励程序员复写findClass(String )而不是protected
Class<?>
loadClass(
String name,boolean resolve)
自定义的加载器可以写入解密方法来加载经过我们加密的class.而用系统默认的加载器则无法加载.