面试题:类加载过程,双亲委派机制
类加载过程分为三个阶段
- 加载
① 将类的字节码载入方法区,并创建类.class对象放入堆
② 如果此类的父类没有加载,先加载父类
③ 加载是懒惰执行的 - 链接
① 验证 - 验证类是否符合Class规范性,合法性,安全性检查
② 准备 - 为static变量分配空间,设置默认值
③ 解析 - 将常量池的符号引用解析为直接引用 - 初始化
① 执行静态代码块与非final静态变量的赋值
② 初始化时懒惰执行
双亲委派
-
所谓双亲委派,就是指优先委派上级类加载器进行加载,如果上级类加载器
① 能找到这个类,由上级加载,加载后该类也对下级加载器可见
② 找不到这个类,则下级类加载器才有资格执行加载
-
能不能自己写个类叫java.lang.system?
不行
① 假设自己写的类加载器用双亲委派机制,那么优先由启动类加载器加载真正的System类
② 假设自己写的类加载器不用双亲委派,加载自己写的类时,需要先加载父类java.lang.Object,而没有用委派会导致失败
③ 自定义类加载器加载以java.打头的类时会抛安全异常,jdk9以上将这些特殊包名与模块进行了绑定,编译都过不了双亲委派的目的有两点:
① 让上级类加载器中的类对下级共享,即能让你的类能依赖到jdk提供的核心类
② 让类的加载有优先次序,保证核心类优先加载