类与类加载器:每一个类加载器,都拥有一个独立的类名称空间。比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义。
从java虚拟机角度划分类加载器:1.启动类加载器,是虚拟机自身的一部分
2.所有其他的类加载器,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader
进一步细致划分:1.启动类加载器/引导类载入器(将虚拟机启动需要的类库加载到虚拟机内存中。启动类加载器无法被java程序直接引用)
2.扩展类加载器(加载lib目录下的类库,开发者可直接使用扩展类加载器)
3.应用程序类加载器/系统类载入器(程序默认的类加载器,开发者可直接使用)
-----------------------------------------------------------------------------------
类加载器之间的这种层次关系称为类加载器的双亲委派模型。
双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。这里的父子关系一般不会以继承的关系实现,而是以组合关系来复用父加载器代码。
双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器无法加载时,子加载器才会尝试自己去加载。
优点:java类随着它的类加载器一起具备类一种带有优先级的层次关系。例如java.lang.Object,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此object类在程序各种类加载器环境中都是同一个类。双亲委派模型对于保证java程序的稳定运作很重要,很好的解决了各个类加载器的基础类的统一问题。
-----------------------------------------------------------------------------------
破坏双亲委派模型
例1:线程上下文类加载器。父类加载器请求子类加载器去完成类加载的动作,逆向使用类加载器。比如java中jndi、jdbc、代码热替换、模块热部署等