Bootstrap ClassLoader
最顶层的类加载器,主要加载核心类库
Extention ClassLoader
扩展的类加载器
AppClass Loader
又叫SystemAppClass,加载当前应用的classpath的所有类
一个ClassLoader创建时如果没有指定parent,那么它的parent默认就是AppClassLoader
AppClassLoader的parent是ExtClassLoader,ExtClassLoader的parent是null
BootStrap ClassLoader是由C++编写的,是虚拟机的一部分
委托模式
双亲委托
某个class加载的过程:
①AppClassLoader去查找缓存,有则从缓存获取,没有就委托给父类加载器(ExtClassLoader);
②ExtClassLoader重复AppClassLoader的步骤,有就获取,没有就委托给父类加载器(BootStrapClassLoader);
③BootStrapClassLoader重复步骤,有就获取,没有就从sun.mic.boot.class路径下面查找,找到了就返回,没有找到就让子加载器(ExtClassLoader)自己去查找;
④ExtClassLoader去自己的java.ext.dirs路径下去找,找到返回,没找到让子加载器(AppClassLoader)去找;
⑤AppClassLoader去自己的java.class.path路径下找,找到返回,没有就让子类找,没有子类就抛出异常
ContextClassLoader
自定义类加载器
继承ClassLoader类
重写findClass()方法
在findClass()方法中调用defineClass()方法
Tip:defineClass()方法可以将二进制内容转换成Class对象
解密类加载器
定义一个类加载器来对特定的class文件进行加载(其中包含解密或其他特定过程);
例如一个特定的类SpecialTest.class是经过加密后得到的class文件,此时可以定义一个特定的ClassLoader来对器进行解析,解析的过程中就会去解密相应的部分。
结论:这样的类只能被定义的特定类加载器加载,提高了程序的安全性