ClassLoader 干的事,就是把class文件加载到JVM中去。
Java默认提供3个类加载器
- BootstrapClassLoader
- ExtClassLoader
- AppClassLoader
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println(ClassLoaderTest.class.getClassLoader());
System.out.println(ClassLoaderTest.class.getClassLoader().getParent());
System.out.println(ClassLoaderTest.class.getClassLoader().getParent().getParent());
}
}
打印出:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@2f92e0f4
null
null 是因为BootstrapClassLoader 不是java写的而是c++写的。
先从顶层开始加载,如果加载不到就交由下一级加载,都加载不到就抛ClassNotFoundException异常。
具体过程
- 加载
- 根据类的全名获取二进制流
- 将二进制流转化为JVM方法区的数据结构
- 在内存中实例化Class对象,放入方法区对外提供接口
- 验证
- 二进制包含的信息符合JVM的要求
- 准备
- 静态变量分配到内存并初始化默认值
- 常量池内的符号引用替换成直接引用
- 初始化
- 静态变量赋值
- 执行静态代码块