class文件加载到内存中的过程分为:
加载、链接、初始化
加载:
查找字节流,并以此创建类的过程。
启动类加载器:
需要通过启动类加载器(boot class loader)启动类加载器有C++实现,没有对应的java对象,Java中用null指代。
其他类加载器:
其他的类加载器都是 java.lang.ClassLoader 的子类,因此有对应的 Java 对象。这些类加载器需要先由另一个类加载器,比如说启动类加载器,加载至 Java 虚拟机中,方能执行类加载。 另外两个重要的类加载器是扩展类加载器(extension class loader)和应用类加载器(application class loader)
双亲委派模型,类加载器加载时先去请求父类加载器,在父类加载器没有加载类的情况下,类加载器才会尝试去加载
链接:
将创建的类合并至虚拟机,使之可被执行 分为,验证、准备、解析 三个阶段 验证阶段,确保加载类满足虚拟机约束条件 准备阶段,为被加载类的静态字段分配内存
初始化:
常量值(ConstantValue):
直接赋值,且被final修饰的类型由虚拟机完成
< clinit > 方法:
除了常量值之外的赋值操作,以及所有静态代码块中的代码,则会被 Java 编译器置于同一方法中,并把它命名为 < clinit >。 类加载的最后一步是初始化,便是为标记为常量值的字段赋值,以及执行 < clinit > 方法的过程。Java 虚拟机会通过加锁来确保类的 < clinit > 方法仅被执行一次。