当前位置: 首页 > news >正文

Java基础-类加载器

写在前面的话:

基础加强包含了:

反射,动态代理,类加载器,xml,注解,日志,单元测试等知识点

其中最难的是反射和动态代理,其他知识点都非常简单

由于B站P数限制,xml,注解等知识点,阿玮写了详细文档供大家学习

1.类加载器

1.1类加载器

  • 作用

    负责将.class文件(存储的物理文件)加载在到内存中

在这里插入图片描述

1.2类加载的完整过程

  • 类加载时机

    简单理解:字节码文件什么时候会被加载到内存中?

    有以下的几种情况:

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

    总结而言:用到了就加载,不用不加载

  • 类加载过程

    1. 加载

      • 通过包名 + 类名,获取这个类,准备用流进行传输
      • 在这个类加载到内存中
      • 加载完毕创建一个class对象

在这里插入图片描述

  1. 链接

    • 验证

      确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全

      (文件中的信息是否符合虚拟机规范有没有安全隐患)

    在这里插入图片描述

    • 准备

      负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值

      (初始化静态变量)

在这里插入图片描述

 + 解析将类的二进制数据流中的符号引用替换为直接引用(本类中如果用到了其他类,此时就需要找到对应的类)

在这里插入图片描述

  1. 初始化

    根据程序员通过程序制定的主观计划去初始化类变量和其他资源

    (静态变量赋值以及初始化其他资源)
    在这里插入图片描述

  • 小结

    • 当一个类被使用的时候,才会加载到内存
    • 类加载的过程: 加载、验证、准备、解析、初始化

1.3类加载的分类

  • 分类

    • Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
    • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
    • System class loader:系统类加载器,负责加载用户类路径上所指定的类库
  • 类加载器的继承关系

    • System的父加载器为Platform
    • Platform的父加载器为Bootstrap
  • 代码演示

    public class ClassLoaderDemo1 {public static void main(String[] args) {//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//获取系统类加载器的父加载器 --- 平台类加载器ClassLoader classLoader1 = systemClassLoader.getParent();//获取平台类加载器的父加载器 --- 启动类加载器ClassLoader classLoader2 = classLoader1.getParent();System.out.println("系统类加载器" + systemClassLoader);System.out.println("平台类加载器" + classLoader1);System.out.println("启动类加载器" + classLoader2);}
    }
    

1.4双亲委派模型

  • 介绍

    如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

在这里插入图片描述

1.5ClassLoader 中的两个方法

  • 方法介绍

    方法名说明
    public static ClassLoader getSystemClassLoader()获取系统类加载器
    public InputStream getResourceAsStream(String name)加载某一个资源文件
  • 示例代码

    public class ClassLoaderDemo2 {public static void main(String[] args) throws IOException {//static ClassLoader getSystemClassLoader() 获取系统类加载器//InputStream getResourceAsStream(String name)  加载某一个资源文件//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//利用加载器去加载一个指定的文件//参数:文件的路径(放在src的根目录下,默认去那里加载)//返回值:字节流。InputStream is = systemClassLoader.getResourceAsStream("prop.properties");Properties prop = new Properties();prop.load(is);System.out.println(prop);is.close();}
    }
    
http://www.lryc.cn/news/10593.html

相关文章:

  • Python 使用pandas处理Excel —— 快递订单处理 数据匹配 邮费计算
  • 【黑马SpringCloud(7)】分布式事务
  • 百度地图API添加自定义标记解决单html文件跨域
  • 如何停止/重启/启动Redis服务
  • python 的selenium自动操控浏览器教程(2)
  • 【Deformable Convolution】可变形卷积记录
  • Oracle-Mysql 函数转换
  • 【Kafka】一.认识Kafka
  • Linux软件管理YUM
  • 【自学MYSQL】MySQL Windows安装
  • Linux c编程之常用技巧
  • 21- 朴素贝叶斯 (NLP自然语言算法) (算法)
  • 设计模式第七讲-外观模式、适配器模式、模板方法模式详解
  • flutter-第1章-配置环境
  • “消息驱动、事件驱动、流 ”的消息模型
  • 量化股票配对交易可以用Python语言实现吗?
  • 机器学习洞察 | 一文带你“讲透” JAX
  • OpenFaaS介绍
  • 【算法设计与分析】STL容器、递归算法、分治法、蛮力法、回溯法、分支限界法、贪心法、动态规划;各类算法代码汇总
  • vue初识
  • 火山引擎入选《2022 爱分析 · DataOps 厂商全景报告》,旗下 DataLeap 产品能力获认可
  • java-spring_bean的生命周期
  • 微服务相关概念
  • 论文解读:(TransA)TransA: An Adaptive Approach for Knowledge Graph Embedding
  • js将数字转十进制+十六进制(联动el-ui下拉选择框)
  • 关于RedissonLock的一些所思
  • C++:倒牛奶问题
  • MySQL8.x group_by报错的4种解决方法
  • 具有非线性动态行为的多车辆列队行驶问题的基于强化学习的方法
  • TrueNas篇-硬盘直通