类加载器子系统(class loader subsystem)
类的加载过程:class loader
loading:
1、通过一个类的全限定名称获取定义此类的二进制字节流
2、将静态存储结构转化为运行时数据结构
3、生成java.lang.class对象,作为方法区的访问入口
linking:
1、验证:确保字节流是否符合虚拟机要求;文件格式验证、元数据验证、字节码验证、符号引用验证
2、准备:为变量分配内存,设置默认初始值(零值)
3、解析:将常量池中的符号引用转换为直接引用的过程
initialization(初始化):
初始化阶段就是执行类构造器方法<clinit>()的过程,才方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来.
<clinit>()不同于类的构造器
虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁(DeadThreadTest.java)
类加载器的分类:
1、引导类加载器(Bootstrap ClassLoader)
Extension ClassLoader(扩展类加载器)
System ClassLoader(系统类加载器)他俩都是间接继承了ClassLoader
2、自定义类加载器(User-Defined ClassLoader):将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器
这四者之间的关系是包含关系,是不是上层下层,也不是父子类的继承关系
引导类加载器(启动类加载器):
c++语言编写
Java的核心类库都是用引导类加载器加