2.jvm类加载系统

news2024/12/28 5:31:18

目录

  • 概述
  • 类加载器
    • 执行顺序
    • 加载时机与过程
      • 类加载的四个时机
      • 一个类的一生
    • 类加载途径
  • 自定义类加载器
    • 工作准备
    • 编写自定义加载器
    • 结果
  • 结束

概述

类加载器

jvm 的类加载是通过 ClassLoader 及其子类来完成的。
有以下类加载器

注意: bootstrap 引导程序

在这里插入图片描述

根据上图总结如下

  • 启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME\lib 目录或通过 -Xbootclasspath 参数指定路径中的且被虚拟机认可(rt.jar) 的类库。
  • 扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOME\lib\ext 目录或者通过 java.ext.dirs 系统变量指定路径中的类库。
  • 应用程序类加载器(Application ClassLoader):负责加载用户路径 classpath 上的类库 (自己编写的程序在此加载)
  • 自定义类加载器(User ClassLoader):加载应用之外的类文件 (例如:JRebel 热部署)

执行顺序

来看一下图:
在这里插入图片描述

  1. 检查顺序是自底向上: 加载过程中会先检查类是否被已加载,从 Custom 到 BootStrap 逐层检查,只要某个类加载器已加载就视为此类已加载,**好处:**保证此类所有 ClassLoader 只加载一次。
  2. 加载的顺序是自顶向下: 也就是由上层来逐层尝试加载此类。

加载时机与过程

类加载的四个时机

public class Student{
	private static int age;
	public static void method(){
	}
}

// Student.age
// Student.method();
// new Student();
Class t = Class.forName("java.lang.Thread")
  • 遇到 new、getStatic、putStatic、invokeStatic 四条指令时
  • 使用 java.lang.reflect 包方法时,对类进行反射调用
  • 初始化一个类时,发现其父类还没初始化,要先初始化其父类
  • 当虚拟机启动时,用户需要指定一个主类 main,需要先将主类加载

一个类的一生

当一个 .java 文件被编译成 class 文件
类的生命周,而非对象的生命周期,看下图
在这里插入图片描述

类加载主要做了三件事:

  • 1.根据 类全限定名称,二进制字节流加载 class 文件
  • 2.字节流静态数据 ,进入方法区 (永久代、元空间)
  • 3.创建字节码 Class 对象

类加载途径

在这里插入图片描述

加载途径总结如下:

  • 1.jar/war
  • 2.jsp生成的 class
  • 3.数据库中的二进制字节流
  • 4.网络中的二进制字节流
  • 5.动态代理生成的二进制字节流

自定义类加载器

工作准备

准备好需要加载的类,代码很简单

package com.fun.demo;

public class Test {
    public void say() {
        System.out.println("hello jvm");
    }
}

编译完成后放置如下路径: /Users/hyl/Desktop/jk/jvm/lib/com/fun/demo
在这里插入图片描述

编写自定义加载器

自定义类加载器 CustomClassLoader 继承 ClassLoader ;重写 findClass()方法,在findClass方法中调用 defineClass() 方法

自定义加载器如下,代码还是很简单的。

package com.fun.classloader;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class CustomClassLoader extends ClassLoader {

    private String rootPath;

    public CustomClassLoader(String rootPath) {
        this.rootPath = rootPath;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // name 传进来的全类名称
        String absolutePath = rootPath + "/" + name.replace(".", "/") + ".class";
        try {
            FileInputStream in = new FileInputStream(absolutePath);
            byte[] classByte = in.readAllBytes();
            return defineClass(null, classByte, 0, classByte.length);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException exception) {
            exception.printStackTrace();
        }
        return null;
    }
}

测试代码如下:

package com.fun.classloader;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Objects;

public class Test {
    //public static void main(String[] args) {
    //    String tmp = "com.fun.demo.Test";
    //    System.out.println(tmp.replace(".", "/"));
    //}

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        CustomClassLoader loader = new CustomClassLoader("/Users/hyl/Desktop/jk/jvm/lib");
        Class<?> clz = loader.loadClass("com.fun.demo.Test");
        if (Objects.nonNull(clz)) {
            Object o = clz.newInstance();
            Method method = clz.getMethod("say", null);
            method.invoke(o, null);
        }
    }
}

结果

运行 main 方法,得到的效果如下:
在这里插入图片描述

结束

至此,jvm 类加载系统就结束了,如有疑问,欢迎评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-组件注册及使用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容-组件注册及使用 目录 1、组件的注册及使用 2、组件常用属性 2.1、directive 2.2、computed 2.…

删除快一年的数据,能够恢复吗?

在数字化时代&#xff0c;数据已经成为了企业和个人生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;我们有时会需要删除某些数据&#xff0c;比如过期的文件、无用的照片或者账号下的旧信息等。但是&#xff0c;当我们删除这些数据后&#xff0c;是否真的能…

一个车厢号码识别算法(2005年的老程序----ccc)

一个车厢号码识别算法&#xff08;2005年的老程序----ccc&#xff09; 2023-09-18 ccc 程序的识别效果 对图中的车厢号码部分用上下两条线限定分为&#xff0c;然后进行识别。 从上面的识别效果可以看出&#xff0c;识别算法具有一定的鲁棒性&#xff0c;能够适应车厢号码的各…

如何改变偏执的性格?

偏执不等同于固执和顽固&#xff0c;固执和顽固更多是好面子的因素&#xff0c;是自尊心的一种表现&#xff0c;而偏执更多是表示处于“不知”的心理状态。当然这里仅仅是讨论性格上的偏执&#xff0c;从性格的角度来分析&#xff0c;如果从精神角度来分析偏执那就比较严重了&a…

在以BUF,字节存储区中,存放有n个带符号整数。试编写统计其中负偶数个数(假设≤9)并且显示。

;默认认采用ML6.11汇编程序 DATAS SEGMENT;此处输入数据段代码BUF DB -2,2,3,4,-4N$-BUF DATAS ENDS STACKS SEGMENT;此处处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS: DATAS, SS:STACKS START:MOV AX, DATASMOV DS,AXMOV BX,0MOV CX,0 LOP: mov AX,[BX] RO…

2023.11-9 hive数据仓库,概念,架构,元数据管理模式

目录 0.数据仓库和数据库 数据仓库和数据库的区别 数据仓库基础三层架构 一.HDFS、HBase、Hive的区别 二.大数据相关软件 三. Hive 的优缺点 1&#xff09;优点 2&#xff09;缺点 四. Hive 和数据库比较 1&#xff09;查询语言 2&#xff09;数据更新 3&#xff09;…

Misc | 相当于签到 第二届“奇安信”杯网络安全技能竞赛

题目描述&#xff1a; 图片似乎经过了什么处理&#xff0c;你能否将其复原呢&#xff1f; 密文&#xff1a; 下载附件&#xff0c;解压得到一张.jpg图片。 解题思路&#xff1a; 1、一张图片&#xff0c;典型的图片隐写。放到Kali中&#xff0c;使用binwalk检测&#xff0c;确…

探索人工智能领域——每日30个名词详解【day2】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

JL-03小型气象站气象环境在线监测设备自动上传并保存数据

JL-03小型气象站产品概述 小型气象站用于对风速、风向、雨量、空气温度、空气湿度、太阳辐射、光照强度、土壤温度、土壤湿度、蒸发量、大气压力等气象要素进行现场监测。既可以通过无线通讯将数据传送至云平台&#xff0c;又可以通过配套的数据采集通讯线与计算机进行连接&am…

智能PDU在现代智慧医院机房末端配电系统中的应用分析

随着智慧医院的高速建设和发展&#xff0c;电子计算机及各类通讯设备在医院中广泛应用&#xff0c;医院信息化程度在不断提高&#xff0c;对医院内网、外网、无线网及设备网的稳定运行提出了更高的要求。信息机房作为医院所有网络数据存储交换的中心&#xff0c;它的7x24小时安…

操作系统——内存管理(一文搞懂操作系统的内存管理)

VIRT(虚拟内存)、RES(常驻内存)和SHR(共享内存) VIRT&#xff08;虚拟内存&#xff09; 进程“需要的”虚拟内存大小&#xff0c;包括进程使用的库、代码、数据&#xff0c;以及malloc、new分配的堆空间和分配的栈空间等&#xff1b;假如进程新申请10MB的内存&#xff0c;但实…

软考中级-软件设计师知识点

软考中级-软件设计师知识点 1. cpu、总线、io控制方式、寄存器2.cpu和dma3.海明码4.中断向量、中断响应时间、保存现场5.补码6.指令流水线计算公式7.存储器分类8.总线9.补码、移码10.漏洞扫描11.木马和病毒12.编译与反编译13.死锁判断14.数据库三大范式15.数据库连结和映射16.最…

Node-RED系列教程-28修改UI默认背景图片

主要使用到如下节点: 实现过程如下: 步骤1:编写背景图片请求服务. http in节点配置: 读文件节点配置: http out节点配置: 到此,背景图片请求服务搭建完成。

制作一本3D仿真翻页电子画册,精致又美观

3D仿真翻页电子画册&#xff0c;可能很多小伙伴都不知道是什么样子的&#xff0c;我用一个图例告诉大家&#xff0c;大家看完就知道3D仿真翻页电子画册到底是什么样子啦&#xff01; 随着人们生活水平的提高&#xff0c;审美也在发生着变化。很显然&#xff0c;之前那种简单的文…

如何搭建高性能地图(访问速度快、层级高、免费)

1、下载地图数据源 可以从很多市面上的地图供应商下载地图&#xff0c;如水经注、bigemap等&#xff0c;大部分层级能够达到19级&#xff0c;也即地图的空间分辨率能够达到0.6米&#xff0c;比如下面广州市的数据。如果数据量少&#xff0c;只需要一个城市或者几个城市的数据&…

遇到了别感到奇怪!这其实是python的三目运算!

三目运算定义 我们熟知的三目运算通常表达式是&#xff1a; 判断条件(返回布尔值) ? 为真的结果 &#xff1a;为假的结果。 Python中的三目运算 而在Python中的三目运算并无 ?和:的表达式这种形式。Python的三目运算符也被称为三元运算符&#xff0c;是一种简洁的条件表达…

MySQL最新2023年面试题及答案,汇总版(6)【MySQL最新2023年面试题及答案,汇总版-第三十六刊】

文章目录 MySQL最新2023年面试题及答案&#xff0c;汇总版(6)01、MySQL中DATETIME和TIMESTAMP的区别&#xff1f;02、简单描述MySQL中&#xff0c;索引&#xff0c;主键&#xff0c;唯一索引&#xff0c;联合索引的区别&#xff0c;对数据库的性能有什么影响&#xff08;从读写…

基于蚁狮算法优化概率神经网络PNN的分类预测 - 附代码

基于蚁狮算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蚁狮算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蚁狮优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

Flipper Zero:极客的终极多功能工具,包含各种数据发射接收途径(硬件便携式工具)

Flipper Zero:极客的终极多功能工具(硬件便携式工具)。 Flipper Zero 是一款为极客、渗透测试者和硬件爱好者设计的终极多功能工具。这款口袋大小的设备集成了多种工具:RFID 读取、写入和模拟,RF/SDR 信号捕获和重放,红外线、HID模拟、GPIO、硬件调试、1-Wire、蓝牙、Wi…

kafka实践-热点数据展示

1 实时流式计算 1.1 概念 流式计算一般对实时性要求较高&#xff0c;同时一般是先定义目标计算&#xff0c;然后数据到来之后将计算逻辑应用于数据。同时为了提高计算效率&#xff0c;往往尽可能采用增量计算代替全量计算。也就是将数据先聚集在集中全量处理。 2.2 应用场景…