1,类加载机制
类被加载的整个过程(生命周期)
加载->验证->准备->解析->初始化->使用->卸载
类的整个加载过程是按顺序开始的,但不能理解为按顺序执行。
1 加载:通过一个类的全限名(路径+类名)来获取定义此类的二进制节流。(实现这个代码模块就是类加载器)。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class 对象,作为方法区这个类的各种数
据的访问入口。
2 验证:文件格式的验证,需要验证文件会不会有一些潜在的风险
3 准备:准备阶段是正式为类变量分配内存并设置类变量初始值(被static 修饰的变量)的阶段,这些变量所使用的内存都将在方法区中进行分配。
4 解析:虚拟机将常量池内的符号引用替换为直接引用的过程
5 初始化:执行类构造器方法的过程
6 使用:Java程序调用
7 卸载:生命周期结束时候被卸载
类加载器
启动类加载器(Bootstrap ClassLoader)
拓展类加载器(Extension ClassLoader)
应用程序类加载器(Application ClassLoader)
自定义类加载器(customized ClassLoader)
2,什么是双亲委派?
作用:保证一个类可以被想对应的类加载器所加载。因为java中不同的加载器加载同一个类会产生两个类,不能保证唯一性。
对于任意一个类,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性
上面这种层次关系称为类加载器的双亲委派模型。我们把每一层上面的类加载器叫做当前层类加载器的父加载器,当然,它们之间的父子关系并不是通过继承关系来实现的,而是使用组合关系(现有对象进行拼装即组合产生新的具有更复杂的功能)来复用父加载器中的代码。
双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。
使用双亲委派模型来组织类加载器之间的关系,有一个很明显的好处,就是Java类随着它的类加载器(说白了,就是它所在的目录)一起具备了一种带有优先级的层次关系,这对于保证Java程序的稳定运作很重要。例如,类java.lang.Object类存放在JDK\jre\lib下的rt.jar之中,因此无论是哪个类加载器要加载此类,最终都会委派给启动类加载器进行加载,这边保证了Object类在程序中的各种类加载器中都是同一个类。
3,破坏双亲委派模型
重新findClass()不会破坏
破坏需要重写 loadClass()
本文详细介绍了Java的类加载机制,包括加载、验证、准备、解析、初始化、使用和卸载七个阶段,以及类加载器的层次结构。重点讲解了双亲委派模型,它确保类由对应的类加载器加载,保证了类的唯一性。同时,讨论了如何通过重写`loadClass()`来破坏双亲委派模型。
7902

被折叠的 条评论
为什么被折叠?



