自定义类加载的用途
1.隔离加载类
2.修改类加载的方式
类的加载模型并非强制,除了Bootstrap外,其他的加载并非一定要引入,或者根据实际情况在某个时间点进行按需动态加载
3.扩展加载源
比如从数据库,网络,甚至是电视机机顶盒进行加载
4.防止源码泄漏
Java代码容易被编译和篡改,可以进行编译加密,那么类的加载也需要自定义,还原加密的字节码
常见的场景
注意点:
在一般情况下,使用不同的类加载器去加载不同的 功能模块,会提高应用程序的安全性,但是,如果涉及java类型转换,则自定义加载器反而容易产生不美好的事情,在做 java类型转换时,只有两个类型都是由同一个加载加载,才能进行类型转换,否者转换时会发生异常
实现一个自定义类加载器
自定义类加载器的时候,一般是重写findClass方法,这样可以沿用loadClass的双亲委派模式
注意:
在上述的例子中,第一次打印出来的加载器发现是系统类加载器,原因是因为双亲委派机制的存在,再加上自定义类加载器的默认上级加载器就是系统类加载器,所以会由系统类加载器尝试去加载,然后由于classpath下面存在heaptest.Student类,所以直接加载成功了,而加载的class文件,其实也不是我们放在桌面的那个class文件。那么当我们把classpath下面的Student.class文件删除的时候,在双亲委派的时候,由系统类去加载的时候,发现classpath下面没有这个类文件,加载不了,就交给自定义类加载去加载,这时候就能由我们自定义的类加载器加载成功了