https://crowhawk.github.io/2017/08/21/jvm_6/
类的加载器:每个类和对应的类加载器在虚拟机中都具有唯一性,也就是说不同的类加载器根据同个class文件加载出来的两个个类.算不同的两个类.
加载机制:双亲委托机制:在类加载器中只分成两种类加载器.一种是由c++写的BootstrapClassload.和其他的由java语言写的类加载器.全都继承与ClassLoad类
如果由开发人员来划分类别:
1:启动类加载器Bootstrap Classload.无法用java代码直接引用.需要吧加载请求委托给引导类加载器.直接用null来代替
2:扩展类加载器:Extension Classload. 开发者可以直接使用
3:应用程序类加载器:Application Classload(系统类加载器).有ClassLoad中的getSystemClassLoad的返回值.负责加载用户类路径上的类库.一般默认的加载器就是这个
双亲委托加载过程:当类加载器接到一个类的加载请求,先把委托给父类加载器去完成.一层一层往上.如果最上层的加载器表示加载不了.则返回给下一级去加载.(bootStrap Classload不是Extension Classload的父类加载器.他的父类加载器是null.当父类加载器为null时.会用启动类加载器)
破坏双亲委托加载机制:
并不是所有的加载都是双亲委托加载机制的;
1:在这个机制之前出现的有一些是用自定义的加载器加载的.(所以只能加一个方法findClass().这个方法唯一的作用就是地调用loadClass())
2:越基础的类由越基础的加载器加载.如果基础类需要调用用户代码时.JNDI(对资源进行集中管理和查找) 解决(线程上下文类加载器)如果创建线程是,还没加载,会调用父类加载器加载.如果在应用程序的全局范围内都没有设置过的话,那这个类加载器默认为Application Classload
3:对动态化程序的追求:不停机更新:基本都在平级类加载器中查找