双亲委派机制的简介说明
下文讲述java中的双亲委派机制,如下所示:
此时并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
如果父类加载器还存在其父类加载器
则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器
如果此时父类加载器可完成类加载任务,就成功返回
如果父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
就没有必要子ClassLoader再加载一次
其次是考虑到安全因素,java核心api中定义类型不会被随意替换
每个WebApp有自己的ClassLoader
加载每个WebApp的ClassPath路径上的类
一旦遇到Tomcat自带的Jar包就委托给CommonClassLoader加载
同包的隔离。另外成熟的开源框架,都有自己的ClassLoader
注意事项: 双亲委派模式中的父子关系并非通常所说的类继承关系
双亲委派机制的原理
双亲委派机制的工作原理:当一个类加载器收到了类加载请求此时并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
如果父类加载器还存在其父类加载器
则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器
如果此时父类加载器可完成类加载任务,就成功返回
如果父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
每个子类都很懒,每次有活就丢给父类去干 直到所有的父类说这件事我也干不了时 此时子类才会自己想办法去完成。
双亲委派机制优点
通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时就没有必要子ClassLoader再加载一次
其次是考虑到安全因素,java核心api中定义类型不会被随意替换
例:通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器, 而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载, 并不会重新加载网络传递的过来的java.lang.Integer, 而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改
综上所述: 我们可以得到双亲委派机制的优点,如下所示: 1.可以防止类的重复加载 2.可以防止Java核心api类库被篡改
双亲委派机制的应用场景
如:Tomcat容器每个WebApp有自己的ClassLoader
加载每个WebApp的ClassPath路径上的类
一旦遇到Tomcat自带的Jar包就委托给CommonClassLoader加载
同包的隔离。另外成熟的开源框架,都有自己的ClassLoader
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。