CrazyDailyQuestion
CrazyDailyQuestion copied to clipboard
2019-12-13:哪些违反了双亲委派模型?为什么?为什么要双亲委派?好处是什么?
在使用ClassLoder进行类加载过程,有没有哪些地方违背了双亲委派模型?
在本地类加载的方式一般我们是这么使用的:
// 正在使用的类加载器:AppClassLoader
ClassLoader c = MicroKibaco.class.getClassLoader();
// AppClassLoader 的父加载器 PlatformClassLoader
ClassLoader c1 = c.getParent();
// PlatformClassLoader 的父加载器是BootStrap.它是c++实现的,返回null
ClassLoader c2 = c1.getParent();
最高一层BootStrap
是通过 c++
实现的,并不存在JVM
体系内,所以输出为null,类加载具有等级制度,但是并非继承关系,以组合方式复用父加载器的功能,这也符合组合有限原则。
但是双亲委派模型并不是强制必须的,对于自己加载不了的类怎么办?直接用线程上下文类加载器完成,通过:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
这条语句获取本地线程然后实现上下类加载。 所以这个地方 Bootstrap
Classloader
加载器拿到了 Application
,ClassLoader
加载器应该加载的类,就打破了双亲委派模型。
为什么要用双亲委派模型?好处是什么?
防止内存中出现多份同样的字节码文件,没法保证类的唯一性,而且如果不使用双亲委派模型,会给JVM虚拟机带来安全隐患,所以要让类的比较有意义前提是被同一个ClassLoader
进行加载。