oracle如何往dg加盘_JVM(七):双亲委派的原因和如何打破双亲委派,以及如何自定义classloader...

542cb12064f2d33abe8a63edb7f44d28.png

x . java ------> javac -------> x . class -------> class文件 被 ClassLoader装载到内存 -------------> 调用JIT编译器和字节码解释器 -------> 执行引擎(调用 os硬件)

双亲委派

先来说双亲委派:双亲委派从下到上是在缓存里查找是否已经加载了,如果加载了,就return

如果没有则,从上到下是尝试加载,bootstrap是加载rt.jar里的类,ext是加载ext下的*.jar里的类,AppClassLoader是加载自己写的在classpath下的 .class

为什么要使用双亲委派?

为了安全。假如不使用双亲委派这个模型的话,自己写一个java.lang.String的类。然后自己写一个类加载器把自己写的java.lang.String加载到内存的话,然后把自己写的类加载器和自己写的java.lang.String打包成一个类库,交给客户,客户在输入密码的时候,密码会存成String类型的对象,但是这个java.lang.String是我自己写的,那完全有可能在这个里面加一点什么东西,把用户输入的密码拿到,发个邮件发给我自己,这样我就可以拿到用户的密码了。

当使用了双亲委派的时候,就会从下往上进行在缓存里检查类是否已经加载,而不是一下子就直接用自己写的类加载器去直接加载,而是从下往上进行在缓存里检查类是否已经加载。这时候程序看见java.lang.String就会警惕,检查到rt.jar里有一个一模一样的java.lang.String,那就一直往上委派,一直到 BootStrap,BootStrap一看,就会去加载rt.jar里的那个Oracle写的java.lang.String,把真的String加载到内存然后返回,而不是把自己写的String加载到内存。


如何自定义classloader和怎样打破双亲委派?

假如有看classloader的源码的话,都知道双亲委派的逻辑就在loadClass这个方法里,那么自定义自己的classloader的关键就是重写这个findClass方法。

而打破双亲委派只需要重写loadClass就可以了。重写的逻辑不应该有双亲委派的逻辑。

Spring和tomcat都有自己的ClassLoader,热部署原理也是一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值