Java 的类加载机制:
class装载验证流程:
加载:(ClassLoader)
装载类的第一个阶段
取得类的二进制流
转为方法区数据结构
在Java堆中生成对应的java.lang.Class对象
链接
验证:
目的:保证Class流的格式是正确的
文件格式的验证
是否以0xCAFEBABE开头
版本号是否合理
元数据验证
是否有父类
继承了final类?
非抽象类实现了所有的抽象方法
字节码验证 (很复杂)
运行检查
栈数据类型和操作码数据参数吻合
跳转指令指定到合理的位置
符号引用验证
常量池中描述类是否存在
访问的方法或字段是否存在且有足够的权限
准备:
分配内存,并为类设置初始值 (方法区中)
public static int v=1;
在准备阶段中,v会被设置为0
在初始化的<clinit>中才会被设置为1
对于static final类型,在准备阶段就会被赋上正确的值
public static final int v=1;
解析:
符号引用替换为直接引用;
(字符串引用对象不一定被加载\指针或者地址偏移量引用对象一定在内存)
初始化:
执行类构造器<clinit>
static变量 赋值语句
static{}语句
子类的<clinit>调用前保证父类的<clinit>被调用
<clinit>是线程安全的
类装载器ClassLoader:
负责类装载过程中加载阶段,抽象类,它的实例 装载到jvm 中,
方法有:loadclass,defineclass,findclass,findLoaderClass
jdk中classLoader默认设计模式:
自低向上检查类是否加载,自顶向下尝试加载类
bootstrap classloader rt.jar
extension classloader java_home /lib/ext/*.jar
app classloader classpath下
custom classloader 自定义路径