在我看来双亲委派机制的核心就是提高java运行的安全性,防止程序员自己写一些可能会和java初始下的一些类产生冲突的类。
对于双亲委派机制来说,需要先了解java的类加载器:
从java虚拟机的角度来说,只有两种不同的类加载器,一种是启动类加载器,是由c++语言实现的,另一种是其他所有的类加载器,是由java实现的。
但,我们一般是从开发者的角度来看的,这样子的话java的类加载器有四类:
1.启动类加载器(bootstrap):
是由c++编写的,相当于是最重要的加载器,是不允许直接引用
2.标准扩展类加载器(ext):
这个是可以直接使用的
3.应用程序类加载器(application):
在我看来和标准那个差不多,但是呢(更小一级),也是可以直接使用的,并且可以通过 getSystemClassLoader()方法返回。
4.自定义的类加载器
顾名思义,就是用户自己定义的
这几个关系基本上来说可以是:
由这个图可以看到,除了最上面的启动类加载器,每一个类加载器都有一个“父类加载器”,这也就引出了这个双亲委派机制。
双亲委派机制的流程:
其实也就是当一个类加载器收到了类加载的请求的时候,他不是直接进行加载,而是把这个请求委派给他的父类加载器去完成,而他的父类也有传到他的父类进行委派请求,知道收到父类自己反馈到自己无法完成这个请求,再回返回回去。
再具体一点就是,比如我们自己写了一个com.tets.T1类,并且我们自己没有写自定义类加载器,那么这个类就会被应用程序类加载器响应,并且应用程序加载器会把这个委派给扩展类加载器,然后扩展类也是把这个委派给了启动类加载器,启动类加载器没有父类可以委派了,他尝试着自己加载这个类(在自己的路劲里找这个类),然后发现找不到,也就是加载失败,就会又返回到扩展来加载,发现也在路劲下找不到,就又回到了应用程序类加载器,直到找到了,并把类加载出来。
在一个博客里看到一个更“形象的”:
可以把每个类加载都想成一个大懒汉,每次让他办事时他都让爸爸代办。没想到爸爸也是个大懒汉,于是爸爸也让他的爸爸代办。这是到了爷爷那里,爷爷也很懒,但是他没有爸爸了,于是只能一边抱怨一边干,然后发现自己做不了,又骂骂咧咧的把活儿交给了自己的儿子,然后爸爸开始干活,发现自己也不能完成这个任务,于是他也是骂骂咧咧的把活交给了儿子,儿子挨了一顿骂,然后开始干活,经过了1小时的苦干,这个活儿终于完事了
存在的意义:
好像看着特别复杂的样子,开发人员肯定是牺牲了这些,换取到了什么其他的优点,优点就是在于大大提高了安全性和稳定性,主要是让一些特定的类只能有一个存在于内存当中。专业的话叫做“有一种带有优先级的层次关系”
本条博客参考自:https://www.cnblogs.com/luckforefforts/p/13642685.html
https://blog.csdn.net/yan245294305/article/details/86777503