对类加密之后,需要用自己的方式把类再加载出来。正常的时候咱们写的类也需要被类加载器加载到内存中。所以,就涉及到类加载器的知识了:
系统默认三个类加载器,分别是:BootStrap,ExtClassLoader,AppClassLoader。那么这几个类加载器有什么区别呢?
首先类加载器有父子关系。BootStrap是爷爷(用C++编写,主要负责加载jre/lib/rt.jar),ExtClassLoader是爸爸(主要用于加载JRE/lib/ext/*.jar),AppClassLoader是儿子(用于负责加载ClassPath指定目录下的所有jar)。
所以我们一般写的class文件都是AppClassLoader加载的。那假如我们写了一个类,我们把这个类复制一份,放到ExtClassLoader目录下,那么类加载器会怎么加载呢?这就要提到类加载器的委托机制了。
类加载器的委托机制:当一个线程调用一个类的时候,首先用当前线程的类加载器去加载这个类,这个类加载器一开始不加载,会通知他的上一级类加载器去加载,等到了BootStrap加载器的时候,如果没有就再让调用的下级加载器去加载。如果都没有就报ClassNotFoundException异常。也可以直接指定类加载器去加载。
所以我们可以自己定义一个类加载器,让这个让这个类加载器去加载我们加密过的类。自定义类加载器需要继承ClassLoader类,并且重写findClass方法。
class MyClassLoader extends ClassLoader {
private String path = null;
// 设置自定义类加载器的目录
public