Java类加载的过程

1.Java类加载的过程

程序员编写".java"文件,经过javac编译器得到".class"文件 ,在虚拟机JVM中为了将字节码".class"文件编译为机器码文件需要将字节码文件加载到虚拟机的内存中,这个过程称之为类的加载过程,具体来说可分为以下五个阶段:

1.1 加载

通过类的完全限定名查找这个类的字节码文件,并利用字节码文件创建Class文件作为该类的数据访问入口

1.2验证

目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证

1.3准备

为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即0(如static int i=5;这里只将i初始化为0,至于5的值将在初始化时赋值),这里不包含用final修饰的static,因为final在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。

1.4解析

主要将常量池中的符号引用替换为直接引用的过程,符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

1.5初始化

类加载最后阶段,若该类具有超类(父类),则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化)。

2.类加载器的介绍

类加载器主要用于将字节码文件加载到虚拟机中

2.1四种种类加载器

  • 启动类加载器:用于加载java核心类库,无法被java程序直接引用
  • 拓展类加载器:加载java的拓展库
  • 系统类加载器:用于根据类路径加载java类,Java使用的类一般都是有它完成加载
  • 用户自定义类加载器:通过继承java.lang.ClassLoader类的方式实现

2.2什么时候使用类加载器?

  • new对象时
  • 访问某个类或者接口的静态变量时
  • 调用静态方法时
  • 反射
  • 初始化一个子类时,其父类首先会被加载
  • JVM启动时标明的启动类
  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值