JVM之双亲委派机制

本文深入探讨Java的双亲委派机制,解释其工作原理,包括类加载过程中的查找与加载步骤。阐述该机制的两大优势:防止重复加载及保护核心类不被篡改。并介绍两种破坏双亲委派机制的方法,适用于特定场景。

1什么是双亲委派机制?

在类A.java被编译成A.class字节码文件时,要使用类加载器来将A.class字节码文件加载到JVM中转换为Class(A)对象(一个类只有唯一的Class(A)对象),这是之前也提到过的类加载器的主要功能。
对于双亲委派机制就是加载的实现方法,当类A要被实例化等应用时,类加载器首先由底向上逐层查看Class(A)是否加载过,若加载过则直接加载,若到最顶层发现没加载过,则从最顶层逐层向下进行查找加载,若到最低层也没有找到则抛出异常。
查看是否加载过:
自定义类加载–>AppClassLoader–>ExtClassLoader–>BootStrapClassLoader
由顶向下查找加载(之前没加载过):
BootStrapClassLoader–>ExtClassLoader–>AppClassLoader–>自定义类加载
在这里插入图片描述

2使用双亲委派机制的好处?

(1)可以避免加载多份同样的字节码,先检查是否加载过,若加载过则直接加载,不必重新加载。
(2)可以避免核心类被篡改,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委派机制传递到启动类加载器,然而启动类加载器在核心API中发现了这个类,发现该类已被加载。并不会重新加载网络传递的java.lang.Integer而是直接返回已经加载过的Integer.class。这样可以预防核心API被随意篡改。

3如何破坏双亲委派机制

在某些情况下父类加载器需要委托子类加载器去加载class文件,受到加载范围的限制,父类加载器无法加载到需要的文件,需要破坏双亲委派机制去实现。
这里举破坏双亲委派的一个情况:DriverManager要加载各个实现了Driver接口的实现类来进行管理,但是DriverManager由启动类加载器加载,只能加载JAVA_HOME的lib下文件,而Driver接口的实现是由服务商提供的,由系统类加载器(线程类上下文加载器)加载,这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派机制。
对于破坏双亲委派机制的方法主要有两种方式:
(1)引入线程类上下文加载器(上面例子用到的方式):线程上下文类加载器破坏了双亲委派模型,可以在执行线程中抛弃双亲委派加载链模式,使程序可以逆向使用类加载器。
(2)自定义ClassLoader:
如果不想不破坏双亲委派模型,只要去重写findClass方法。
如果想要去破坏双亲委派模型,需要去重写loadClass方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值