JAVA虚拟机如何加载类

首先我们需要知道什么叫做 类。

在java虚拟机中主要包括两种数据类型:基本数据类型和引用数据类型。

基本数据类型:java虚拟机直接生成的

引用数据类型:类、接口、数组、泛型(会进行擦拭)。数组也是虚拟机直接生成的。所以主要理解类与接口的加载。类与接口是有对应的字节流。那么该字节流从哪里获取呢?

除了我们都知道class文件之外,还可以通过网络中获取(applet);程序内部:动态代理技术;从zip包中获取

类加载的过程主要包括:加载、链接、初始化

一、加载:查找字节流,并创建类的过程

1.数组类尽管没有字节流,是java虚拟机直接生成的,但是去掉所有维度的数据类型,即元类型还是与类加载器有密切关系的。

2.对于类和接口,是通过类加载器获取对应的字节流的。类加载机制为:双亲委派模型

类加载器分为:

2.1 启动类加载器:由java虚拟机直接生成,是由C++语言实现的,用null来代替。主要加载:D:\work_soft\java\jre\lib中.jar包中的类以及虚拟机参   数-Xbootclasspath指定的类。

2.2 扩展类加载器:其父类加载器为启动类加载器。主要加载D:\work_soft\java\jre\lib\ext中.jar的类

2.3 应用类加载器:其父类加载器为扩展类加载器。主要加载应用程序路径下的类

2.4 自定义类加载器:其父类加载器为应用类加载器。

双亲委派模型

其工作流程:当一个加载器收到加载类的请求时,首先将该请求转发给其父类加载器,以此递归,直至到达最上层的父类加载器,除非该父类加载器无法加载该类,才依次往下传递,直至该该加载器加载该类。

二、链接:验证、准备、解析

2.1 验证:确保class文件中的字节流OK(文件格式、元数据、字节码、符号引用),不会危害虚拟机。

2.2 准备:为类变量(被static修饰的字段)进行初始化(零值),不是实例变量。

2.3 解析:符号引用解析为直接引用。

符号引用一直以符号来组成的字面量,符号引用的目标不一定被加载到内存中,不过遇到解析的时候,肯定会先加载它;

直接引用:直接指向目标的指针,引用的目标必定存在于内存中。

字节码指令使用到了符号引用的时候,去解析该符号引用。所以符号引用的解析不一定在 链接阶段完成。

三、初始化:为final修饰的字段赋值(仅包括基本数据类型与string,其余类型也是在<clinit>())、执行类加载器<clinit>()

类何时被初始化?

3.1 类启动时,初始化用户指定的类(包含main方法的类)

3.2 遇到new指令的时候,初始化new指令的目标类

3.3 遇到getstatic、putstatic、invokestatic字节码指令的时候,初始化目标类

3.4 初始化子类的时候,会检查父类是否已经初始化,若没有,则初始化父类

3.5 如果一个MethodHandle实例的解析结果REF_getstatic、REF_putstatic、REF_invokestatic的方法句柄,则对应的类进行初始化

3.6 java.lang.reflect包的方法对类进行反射调用的时候,初始化该类

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值