0x01 类加载的步骤
包括加载、连接和初始化
加载:加载文件写入内存,创建java.lang.class对象
连接:类的二进制数据合并入jre
初始化:field初始化,初始化父类、执行初始化语句等
0x02 类加载器
Bootstrap ClassLoader:根类(或叫启动、引导类加载器)加载器
加载java核心类,原生C++
Extension ClassLoader:扩展类加载器
加载jar包中的类
System ClassLoader(或Application ClassLoader):系统类加载器
java xxx -classspath,java.class.path
三个机制
- 全盘负责:当一个类加载器加载某个Class时,该Class所依赖和引用的其它Class也将由该类加载器负责载入,除非显式的使用另外一个类加载器来载入。
- 双亲委派:当一个类加载器收到了类加载请求,它会把这个请求委派给父类加载器去完成,依次递归,因此所有的加载请求最终都被传送到顶层的启动类加载器中。只有在父类加载器无法加载该类时子类才尝试从自己类的路径中加载该类。(注意:类加载器中的父子关系并不是类继承上的父子关系,而是类加载器实例之间的关系。)
- 缓存机制:缓存机制会保证所有加载过的Class都会被缓存,当程序中需要使用某个类时,类加载器先从缓冲区中搜寻该类,若搜寻不到将读取该类的二进制数据,并转换成Class对象存入缓冲区中。这就是为什么修改了Class后需重启JVM才能生效的原因。