为了账号安全,请及时绑定邮箱和手机立即绑定

为什么java里面会用三种classloader,这样设计目的是什么?

为什么java里面会用三种classloader,这样设计目的是什么?

倚天杖 2019-05-20 18:26:10
为什么java里面会用三种classloader,这样设计目的是什么?还有双亲委派机制为什么要这么用?看了不少原理,但是一直没理解这么做的好处。
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

classloader最顶级的那个就是bootstrapclassloader,至于为什么要设计双亲委派机制这种模型,说的简单一点其实就是为了保护JDK的安全性,如果你自己写了一个System这个类,如果没有这种机制,那么你自己写的这个类将被加载,这样对JDK的入侵是很大的,那么现在有这种机制,bootstrapclassloader会去rt包下找是否有System这个类,如果有,那么直接就加载了JDK自己的这个类,对于新定义的这个类则不会做处理,设计者设计这样的模式对保护JDK的完整性和一致性都是有好处的。
                            
查看完整回答
反对 回复 2019-05-20
?
精慕HU

TA贡献1845条经验 获得超8个赞

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查看里面有没有该类资源,有则直接安徽或者加载,从而保证了底层的类一定是预先加载的,这样可以对虚拟机的安全得到了很好的保证。
                            
查看完整回答
反对 回复 2019-05-20
  • 2 回答
  • 0 关注
  • 754 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信