类加载机制
类加载的生命周期
加载:把文件字节流转换虚拟机中的变量
验证:验证是否符合虚拟机的要求
准备:类变量(为static修饰的变量)分配内存,设置初始值,是虚拟机的初始值标准,例如int a=0;
解析:常量池中的引用换为实际值。
初始化:执行Java代码,把static有关的代码块执行一遍。
初始化时机:
- 创建类的实例
- 访问某个类或接口的静态变量,或者对该静态变量赋值
- 调用类的静态方法
- 反射
- 初始化一个类的子类
- Java虚拟机启动时被表明为启动类的类
- 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。
使用:new出实例使用时执行。
卸载:垃圾回收。
加载器
其中在开发Java中能够影响的只有加载这一步骤。
类加载器经常用在:部署时的热替换以及类的加密和解密。
双亲委派模型
为什么有这个双亲委派模型?
保持一个合适的优先级。
比如Object这个类,通过层层加载器,最终都是通过根加载器加载的,保证这个Object类在各个程序中是同一个类,因为决定这个类是不是同唯一类,有两个标准:第一:这个类本身;第二:加载这个类的类加载器。如果一个类由不同的类加载器加载,那么对于虚拟机而言就是两个类。
问题:
倘若A加载器和B加载器各自加载业务类,那么这个业务类到底是继承A加载器中的Object?还是B加载器中的Object? 就会导致Jdk最底层程序无法保证。