• JVM学习——类的加载器以及类的加载过程


    类加载器以及类的加载过程可分为三个阶段。
    1、加载(引导类,扩展类,系统类)
    2、链接(验证,准备,解析)
    3、初始化

    类加载系统只负责class的加载,不负责是否可以正常运行,运行是由ExecutionEngine决定的。
    加载到的类信息存放在方法区中(JDK8以后改名了),此外也会存一些常量的信息,都是加载的class类中的。

    1、加载
    加载先通过一个class文件的名的二进制字节流读取,并将这个字节流所代表的数据结构在方法区中构建。
    之后生成一个该类的Class对象,用于以后的访问接口。

    类加载的方式:
    1、从本地系统中加载
    2、通过网络获取:Web Applet
    3、从zip文件中读取,后续有jar、war
    4、运行时计算读取:动态代理
    5、其他文件生成:JSP
    6、从专有数据库中提取
    7、从加密文件路径中提取
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2、链接
    阶段一:验证,主要在于验证class文件是否符合规范,保证正确性。主要有:文件格式验证、元数据验证、字节码验证、符号引用验证。
    阶段二:准备,为类的变量进行默认值赋值。(final修饰的静态变量自动分配配置好的值)这里不进行初始化操作
    阶段三:解析,将class中的符号和常量池中的引用对应上,还有一些接口、字段、类方法、接口方法、方法类型等等。一般伴随着JVM执行完初始化后执行。

    3、初始化
    执行方法,该方法是为为类中的赋值动作和静态代码块中的语句进行赋值,执行顺序与代码顺序保持一致。
    类的构造器与上述方法不一致,构造器会另外执行。
    若该类存在父类,会先进性父类的加载。
    虚拟机会保证一个类的在多线程下保持被同步加锁。既只会初始化一个放到内存中保存。


    类的加载器分类
    在JVM中只有两种分类,分别为引导类加载器和自定义类加载器,简单来说就是C写的就是引导类,Java写的就是自定义类加载器。自定义类加载器有常用的就是扩展类加载器和系统类加载器。

    启动类加载器:
    1、是C/C++实现的代码
    2、用于加载Java的核心类库
    3、是扩展类和系统类加载器的父类加载器,注意不是继承关系
    4、只加载java,javax,sun等开头的类

    扩展类加载器:
    1、Java实现
    2、诞生于ClassLoader类
    3、加载JDK安装目录的jre/lib/ext子目录下的类库,用户也可以将自己的类库放到这个路径下,也会被扩展类加载器加载。

    系统类加载器:
    1、Java实现
    2、负责classpath路径下的类加载
    3、是程序默认的加载器


    自定义加载器使用场景
    1、隔离加载类,比如重名
    2、修改加载方式,动态代理
    3、多加载源,可能来自于其他地方的类库
    4、加密代码

    实现方法:
    1、继承ClassLoader方法,并实现findClass(String name)方法,用于自定义获取加载路径。
    2、这里如果是需要加密代码可以对这个name路径进行解密or加密
    3、如果不需要加密,可以直接继承URLClassLoader

  • 相关阅读:
    [GN] 车300笔试记
    【SemiDrive源码分析】【X9芯片启动流程】33 - Display模块 相关概念解析
    Win10离线安装choco方案
    什么是TOGAF®?企业架构方法论以指导业务
    线性动态规划
    高等数学(第七版)同济大学 习题4-1 个人解答
    LLM - SFT workflow 微调工作流程
    JAVA遍历Map的几种方法
    基于LSCF和LSFD算法在频域中识别快速实现的MIMO研究(Matlab代码实现)
    使用Spring Cache实现广告缓存并基于RabbitMQ实现双写一致
  • 原文地址:https://blog.csdn.net/zhouxyly/article/details/136792059