类加载器:加载类的工具。
作用:JVM虚拟机首先要将类的字节码加载到内存中,然后将.class文件的内容加载到硬盘中然后对它进行一些处理。而类加载器的作用就是把这个.class文件从硬盘中加载到内存中,然后进行一些处理。
系统默认提供三个主要类加载器,每个类负责加载特定位置的类:BootStrap、PlatformClassLoader、AppClassLoader。
BootStrap为祖宗类不需要被其他类加载,但它不是Java类,是一个C++编写的类,嵌套在JVM虚拟机内核的,虚拟机一启动就会初始化这个类。
类加载器的委托机制:每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他类加载器去加载类,这就是类加载器的委托模式。
委托原理:类加载器一级级委托到bootstrap类加载器,当bootstrap无法加载当前要加载的类时,又一级级回退到子孙类加载器去加载这个类。当回退到最初的类加载器,也不能加载这个类,那就会抛出ClassNotFindException异常。
类加载器父子关系和管辖范围如下:JVM虚拟机中所有类加载器采用树形结构的父子关系,在实例化每个类加载器对象时,需要为其指定一个父级类加载器对象或默认采用系统类加载器为其父级类加载。
自定义加载类:
1、需要继承抽象类ClassLoader;
2、覆盖父类中的findClass方法,生成自己的字节码(通过defineClass方法将得到的.class文件转换为字节码);
3、调用自定义的类加载器,方式:类名.loadClass(String name);其中name是class文件的名称。
范例:将一个加密的.class文件,通过自定义的类加载器进行加载解密
上图中简易的加密方法: