一:类加载器分类
1. 系统类加载器(用c++写的)
- Boootstrap ClassLoader是唯一的系统类加载器,嵌套在JVM内部。
- 用来加载String、Integer等核心类库,包含java,javax,sun等开头的类。
- 用来加载扩展类记载其ExtClassLoder,AppClassLoader。
2. 自定义类加载器(用java写的)
- 定义:派生于ClassLoader类的类加载器。
- 自定义类是AppClassLoader加载的(包括一些外部导入的jar包),AppClassLoader的父加载器是ExtClassLoader(补充BootStrap Classlodaer加载扩展的类库,jre/lib/ext下面的包等等)。ExtClassLoader的父加载器是Boootstrap ClassLoader。
二:双亲委派机制
AppClassLoader的父加载器是ExtClassLoader。ExtClassLoader的父加载器是Boootstrap ClassLoader。他们并不是java中的extends关系,而是我们自己规定的等级,谁是谁的父亲,所谓双亲委派机制(又叫坑爹机制),爸爸能干的活自己绝对不干,直接任务往上派发。
有啥用?
- 避免类的重复加载
- 安全啊,比如我在主目录下建立一个java.lang.String的自定义类(注意跟java库中的报名是一样的哦),然后我们new我们自己定义的String,会发现其实new的还是java库中的类。如果java机制是new了我们自己定义的类。那你写项目的时候,我趁你不注意,偷偷自己实现一个盗版的String放到你的项目上(在java库String上加点bug),你会不会崩溃?
AppClassLoader可以引入,就给父亲,ExtClassLoader也可以搞就继续往上传,BootStrap ClassLoader也可以加载(并且它没有父亲了),它就只能自己弄了(造福子孙,孩子们少干点),就避免了AppClassLoader(用来加载自定义类)加载自定义类产生安全问题。
网友评论