1.类本身和类加载器同时确定一个类的唯一性
2.类加载器的种类
(1).启动类加载器:虚拟机识别,java程序不可调用
(2).拓展类加载器:java程序可调用
(3).应用程序类加载器:java程序可调用,默认类加载器
(4).自定义类加载器
3.双亲委派模式
(1).各类加载器的层次关系:
启动类加载器==>拓展类加载器==>应用程序类加载器==>自定义类加载器
(2).双亲委派模式:
当需要调用类加载器时,自己先不加载,扔给自己的父亲,让他来。每一层的类加载器都这样。
好处:java类也因此有了层级关系
4.双亲委派模式被破坏的三种情况
(1).在双亲委派模式存在之前:因为不存在双亲委派模式,所以肯定是破坏的
(2).双亲委派模式的目的是让类加载能调用统一的基础API,但是如果当基础API需要调用用户的代码时(JNDI),解决方法如下:
使用线程上下文类加载器。本线程如果没有,就去父类中找。如果父类中也没有,就用应用程序类加载器。
所以,此时基础API,也就是启动类加载器,需要去调用线程上下文类加载器(没有的话,就是应用程序类加载器),爷爷辈去调用孙子辈了,违反了双亲委派模式
(3).由于用户对动态性的追求,对于代码热替换,模块热部署等情况,此时都是模块化。不再是树状而是网状。访问如下:
1).对于java.*类,调用父类类加载器;
2).否则,对于委派列表名单的类,调用父类类加载器
3).否则,对于import列表的类,调用export模块的类加载器
4).否则,使用本模块的类加载器
5).否则,使用fragment模块类加载器
6).否则,使用Dynamic Import模块类加载器
7).否则,报错