一. 类的生命周期
加载,验证,准备,解析,初始化,使用,卸载
- 加载:通过类名获取二进制字节流;转为方法区运行时数据结构;生成.class
- 准备时分配内存
- 解析:符号引用->直接引用
- 加载,验证,准备,初始化,卸载 开始顺序一定
初始化条件(初始化前做加载,验证,准备):
- new对象,get/put static变量,调用static方法
- 反射
- 初始化子类时,先初始化父类
- 启动main类,main类先初始化
- 动态语言支持,方法对应的类
二. 双亲委派模型
每个类加载器都有父类;
一个类加载收到类加载请求,先委派给父类加载器,先到顶层,然后在向下。
- Bootstrap ClassLoader 启动类加载器
加载\lib中类库到虚拟机内存 - Extension ClassLoader 扩展类加载器
加载\lib\ext中类库 (开发可用) - Application ClassLoader 应用程序类加载器
系统类加载器,加载ClassPath上指定类库(开发可用) - 自定义加载器(继承ClassLoader)
目的:有了优先级层次关系,防止重复加载。
- 如何破坏双亲委派
类加载逻辑写到findClass()中,父类loadClass失败会调用子类findClass
网友评论