为什么java里面会用三种classloader,ClassLoader保证java安全?

BootstrapClassLoader:

  • 只能用于加载JDK核心类库,系统变量为sun.boot.class.path下面的类。该目录下的%JAVA_HOME%/jre/lib/下的resources.jar;rt.jar等核心类库,该loader底层采用C++编写,自然你也就不能调用啦。

ExtClassLoader :

  • 用于加载一些扩展类,系统变量为java.ext.dirs中的类。作用:加载开发者自己扩展类。

AppClassLoader:

  • 用于加载用户类,这个就是java.class.path下的类,也就是我们自己编写出来的类。

其中这三个加载器顺序为
   BootstrapClassLoader>ExtClassLoader>AppClassLoader,为啥要这样设计?主要是为了扩展与安全。首先你将BootstrapClassLoader作为一个核心类加载器,只加载核心类,不与其他耦合在一起。并且为何要设计这三个加载器,就应该和双亲委派机制放在一起了。

  何为双亲委派机制:简单来说就是当你需要加载类的时候,必须从顶级父加载器先加载,如果父加载不了,则交给子加载器。就相当于小孩子要做决定的时候,要先问问父亲怎么做。

为什么要有这种双亲委派机制:

  保证唯一性:试想,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,多个类加载器都去加载这个类到内存中,系统中将会出现多个不同的Object类,那么类之间的比较结果及类的唯一性将无法保证.
保证安全:由于所有的用户类都会先通过bootstrapclassloader 查看里面有没有该类资源,有则直接安徽或者加载,从而保证了底层的类一定是预先加载的,这样可以对虚拟机的安全得到了很好的保证。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非Yu@Itfuture

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值