哎哟JAVA不错哦
我们都知道jvm类加载使用的是双亲委派模型,那么到底什么是双亲委派模型?这样做的好处又是什么呢?又如何打破双亲委派模型呢?
先来了解下JVM中的类加载器:JVM类加载器大致可以分为以下几种:
1,启动类加载器:Bootstrap ClassLoader:负责加载jre\\lib下面的jar中的类进入内存,在HotSpot虚拟机中,是使用C++进行实现;
2,扩展类加载器:Extension ClassLoader:负责加载jre\\lib\\ext下面的扩展型jar中的类进行入内存;
3,系统类加载器:Application ClassLoader:负责加载应用中classpath目录下面的所有jar。
4,自定义加载器:通过继承ClassLoader,可实现自己的类加载器,通常可以用在热部署,网络输入的流等类库;
几种类加载器的继承关系如下:
双亲委派模型:一个类加载器收到类加载任务的时候,会先查看是不是已经被加载过,如果没有加载过则委托给父加载器进行加载,父加载器经过同样的过程,如果父加载器搜索不到这个类,则让子加载器自己尝试着加载,如果所有加载器都找不到,则抛出ClassNotFoundException异常;
一句话总结双亲委派模型的特点是:父亲能干的事就让父亲干,干不了再让儿子来;
双亲委派模型好处:比如说,某“坏人”在将jre\\lib下面的包中的某个类(a.b.c)中,意图植入大量的恶意代码,但因为这个原本的类已经被Bootstrap ClassLoader加载过了,后面加入的a.b.c不会在加载进入内存中,双亲委派模型的类加载方式,就能防止恶意代码的向顶层污染;
打破双亲委派模型:要打破双亲委派模型的加载方式,首先需要集成ClassLoader,然后再重写loadClass(),findClass(),因为双亲委派的代码逻辑主要在loadClass方法中,重写覆盖loadClass方法,让父类加载器加载失败,这样就可以交由自定义的类加载器加载了;
双亲委派模型就说这么多,下次将会从ClassLoader类加载器的源码角度,详细分析下类加载器的加载过程,如果有需要的朋友,敬请关注。。