类加载器系统工作:
1、加载阶段(引导类加载器、扩展类加载器、系统类加载器)
2、链接阶段(验证、准备、链接)
3、 初始化
加载:
- 通过一个类的全限定名获取此类的二进制字节流
- 将二进制字节流中的代表静态存储结构的数据结构转化为方法区里面的运行时的数据结构
- 在数据区里面生成一个代表这个类的Java.lang.Class对象,作为方法区的这个类的各种数据访问入口
验证 - 目的为了验证Class文件的字节流中包含的信息符合当前的虚拟机要求,确保正确性
- 包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证
准备 - 把类变量分配到内存中并对变量赋初值即0
- 这里不包含用final修饰的static,因为常量在编译时就被初始化了
- 这里不会为实例变量分配初始化,因为类变量会分配在方法区中,而实例变量会随着对象的创建一起分配在堆内存中
解析 - 将常量池中的符号引用转换为直接引用(指针)的过程
- 在一个类实现中往往会用到许多别的类,此时需要引用
初始化 - 初始化阶段就是执行类构造器方法()的过程
- 构造器方法不需要定义,时Javac编译器自动收集类中的所有类变量赋值动作和静态代码块中的语句合并而来
- 构造器方法中指令按语句的源文件顺序执行
- Java虚拟机保证子类的()执行前,父类的要执行完毕
- ()在多线程状态下要被同步加锁。(保证只被加载一次,加载一次后的线程需要使用可以直接从方法区中调用)
从上到下四类加载器:引导类加载器、扩展类加载器、系统类加载器、自定义类加载器
引导类加载器
- 专门用来加载核心类库用于提供Jvm自身需要的类,用C/C++语言实现的
- 是扩展类加载器的父类加载器
扩展类加载器
- Java语言编写
- 派生于Class Loader类
- 父亲加载器为启动加载器
- 加载其指定目录下面的类库(java.ext.dirs指定的目录下或者jre/lib/ext目录下)
系统类加载器(应用程序类加载器)
- Java语言编写
- 派生于Class Loader
- 父亲加载器为扩展类加载器
- 负责加载环境变量或者环境变量指定下的类库
- 是应用程序的默认加载器,Java用户自定义的类都由它加载
用户自定义类
作用:隔离加载类、修改类加载方式、扩展加载源、防止源码泄露、
流程:
- 继承Class Loader
- 自定义findClass方法体