class装载验证流程:加载、链接(验证、准备、解析)、初始化
加载:
装载类的第一个阶段
取得类的二进制流
转为方法区的数据结构
在java堆中生成对应的java.long.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是一个抽象类
ClassLoader的实例将读入Java字节码将类装在到JVM中
ClassLoader可以定制,满足不同的字节流获取方式,网络,文件,本地。
ClassLoader负责类装在过程中的加载阶段
ClassLoader重要方法:
public Class<?> loadClass
protected final Class<?> defineClass
protected Class<?> findClass
protected final Class<?> findLoadedClass 寻找已经加载的类
至底向上加载加载类,自顶向下尝试加载类。
Bootstrap ClassLoader (rt.jar /-Xbootclasspath classpath设置这个参数下的类也会被bootstrap)
Extension ClassLoader %JAVA_HOME%/lib/ext/*.jar
App ClassLoader Classpath下
Custom ClassLoader