一:加载器分类
(1)从虚拟来说分为两类,
- 一种是启动类加载器,C++实现,是虚拟机自身的一部分,
- 一种是所有其他类加载器,是java语言实现的,独立于虚拟机外部,并且全部继承自java.lang.ClassLoader.
(2)从java开发人员来说,分为三类
- 启动类加载器(Bootstrap ClassLoader)
- 扩展类加载器(Extension ClassLoader)
- 应用程序类加载器(Application ClassLoader) 是由ClassLoader中的getSystemClassLoader()方法的返回值,也叫系统类加载器
二:类加载器的机制
- 全盘负责制:A要加载B类,那么必须负责加载B中所有的类
- 父亲委托制:子类要使用某个类,先委托父类加载,如果父类没有加载成功,则子类才会被加载
- 缓存机制:缓存机制将会保证所有被加载的Class都会被缓存,当程序中需要使用某个Class时,类缓存器先从缓存区中搜寻该Class,只有当缓存区不存在该Class对象的时候,系统才会读取该类对象的二进制数据,并将其转换为Class对象,存入缓存区中
三:一个类被加载的6种情况
- 创建类的实例的时候
- 调用类的静态方法,或者为静态变量赋值的时候
- 类的静态方法
- 使用反射方式来强制创建某个类或者接口对应的java.lang.class对象
- 初始化某个类的子类的时候
- 直接使用java.exe命令来运行某个类
四:类加载的过程
(1)加载阶段:在加载阶段,虚拟机需要完成三件事情
- 通过一个类的全限定名来获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据的访问入口
(2)验证阶段:验证是连接阶段的第一步,目的是保证Class文件的字节流中包含的信息符合当前虚拟机的请求,其中主要验证四部分内容
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
(3)准备阶段:正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配
(4)解析阶段:虚拟机将常量池内的符号引用替换为直接引用的过程,主要分为四块内容
- 类和接口的解析
- 字段解析
- 类方法解析
- 接口方法解析
(5)初始化阶段:类加载过程中的最后一步,真正开始执行java代码,根据程序员的定义去初始化类变量和其他资源
浙公网安备 33010602011771号