类加载-类加载过程

3.1. 类加载介绍

1)类加载的任务
根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例。
2)加载流程
如下图所示,class文件的加载过程可以分为三步:loading(加载)、linking(链接)、initilizing(初始化)。
在这里插入图片描述

【loading】loading是将class文件(二进制字节)加载进入内存。通过一个类的完全限定查找此类字节码文件,并利用字节码文件生成代表这个类的Class对象。
在loading步骤中,class文件被加载到内存之后是生成两个部分,一是class文件里面的内容,二是class类对象,class类对象指向class文件里面的内容。
在这里插入图片描述

【linking】linking可分为三个步骤,verification(验证)、preparation(准备)、resolution(解析)。其中,verfication是校验加载进来的class文件是否符合class文件的标准,其中包含四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证;preparation是对静态变量赋默认值,但是不包含final static类型的静态变量,因为这种变量在编译的时候就已经被初始化了,此外也不会给实例变量分配初始化,因为类变量在方法区中,实例变量会随着对象一起被分配到java堆中;resolution主要是将符号引用转换为直接引用,符号引用是用一组符号来描述目标,可以是任何字面量,而直接引用是直接指向目标的指针,或相对偏移量,或一个间接定位到目标的句柄,resolution的类型有:类的解析、接口解析、字段解析、类方法解析、接口方法解析等。
【initializing】initilizing是对静态变量和成员变量赋值为初始值,若该类还有超类,则对其进行初始化。
3)class文件的加载方式
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式即把请求逐层交由父类处理,这是一种任务委派模式。
4)加载不在同一个程序中其他类的方法
先获得类加载器,然后类加载调用loadClass()方法加载类。
例如:在程序LoadOtherClass中,加载位于ClassLoader目录下的另外一个程序中的ThingsOfDiffLoader类,

public class LoadOtherClass {
    public static void main(String[] args) throws ClassNotFoundException {
        Class className = LoadOtherClass.class.getClassLoader().loadClass("ClassLoader. ThingsOFDiffLoader");
        System.out.println("加载类的名称为 " + className.getName());
        System.out.println("加载该类的加载器为 " + className.getClassLoader());
    }
}

运行结果:加载类的名称为ClassLoader.ThingsOfDiffLoader
加载该类的加载器为jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值