• 详解 类的加载


    (请观看本人博文 —— 《详解 反射机制》



    类加载器

    在讲解类加载器之前,本人要先来讲解下一个知识点 —— 类的加载

    类的加载:

    概述

    当程序要使用某个类时,如果该类还未被加载到内存中
    则系统会通过 加载连接初始化 三步来实现对这个类进行初始化

    现在,本人就对这三步骤来做下详细的说明
    说明

    • 加载
      就是指将class文件读入内存,并为之创建一个Class对象
      任何类被使用时系统都会建立一个Class对象
    • 连接
      验证 : 是否有正确的内部结构,并和其他类协调一致
      准备 : 负责为类的静态成员分配内存,并设置默认初始化值
      解析: 把类中的符号引用转换为直接引用
    • 初始化
      静态变量赋值,执行static代码块
      (注:
    1. static代码块只有jvm能够调用
    2. 如果是多线程需要同时初始化一个类,仅仅只能允许其中一个线程对其执行初始化操作,其 余线程必须等待,只有在活动线程执行完对类的初始化操作之后,才会通知正在等待的其他线程)

    因为子类存在对父类的依赖,
    所以类的加载顺序是先加载父类后加载子类,初始化也一样。
    不过, 父类初始化时,子类静态变量的值也有有的,是默认值。
    最终,方法区会存储当前类类信息,
    包括类的静态变量、类初始化代码(定义静态变量时的赋值语句 和 静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块 和 构造方法)和 实例方法,还有父类的类信息引用。

    那么,类在什么时候被加载呢?

    类的加载时机

    • 创建类的实例
    • 访问类的静态变量,或者为静态变量赋值
    • 调用类的静态方法
    • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
    • 初始化某个类的子类
    • 直接使用java.exe命令来运行某个主类

    那么,现在,本人来讲解下 类加载器

    类加载器:

    概述

    负责将.class文件加载到内存中,并为之生成对应的Class对象

    类加载器一共分为三类

    分类
    Bootstrap ClassLoader (根类加载器)
    Extension ClassLoader (扩展类加载器)
    Sysetm ClassLoader (系统类加载器)

    现在,本人来介绍下这三种类加载器的作用

    作用

    • Bootstrap ClassLoader (根类加载器):
      也被称为引导类加载器,负责Java核心类的加载
      比如System,String等。在 JDKJRE 的 lib目录rt.jar文件
    • Extension ClassLoader (扩展类加载器):
      负责JRE的扩展目录jar包的加载
      JDKJRE的lib目录ext目录
    • Sysetm ClassLoader(系统类加载器):
      负责在JVM启动时加载来自java命令class文件
      以及classpath环境变量所指定的jar包和类路径

    (本人 反射机制 总集篇博文链接:https:////www.cnblogs.com/codderYouzg/p/12419061.html

  • 相关阅读:
    PTA习题解析——银行排队问题
    线性表结构详解
    SkipList (跳跃表)解析及其实现
    C++面向过程编程
    WEB 性能测试用例设计以及总结
    PHP设计模式概述
    影响Linux发展的四位天才黑客
    从Linux 与 Unix 异同,看开源世界的发展!
    移动开发的跨平台技术演进
    AI和机器学习对云应用的安全产生了何种影响?
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12419073.html
Copyright © 2020-2023  润新知