【JVM篇】什么是类加载器,有哪些常见的类加载器

文章目录

🍔什么是类加载器

负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中

🛸有哪些常见的类加载器

  • 启动类加载器

    启动类加载器是有Hotspot虚拟机通过的类加载器,加载核心类

    默认加载Java安装目录 / jre / lib下面的类文件

  • 扩展类加载器

    扩展类加载器是jdk中提供的,是使用Java编写的类加载器,加载扩展类

    默认加载Java安装目录 / jre / lib / ext 下的类文件

  • 应用程序加载器

    应用程序加载器是jdk中提供的,使用Java编写的类加载器,加载应用程序classpath下的类

  • 自定义类加载器允许用户自行实现类加载的逻辑,可以从网络,数据库等来源加载类的信息

    自定义类加载器需要继承ClassLoader抽象类,重写findClass方法

下面我们来写一个自定义类加载器

我们随便找一个class文件(不知在哪里找文件的同学可以参考这一篇文章 字节码文件)

我们使用jclasslib双击打开这个文件

可以看到这个类名位于固定目录下,不能被启动类加载器,扩展类加载器,应用程序加载器加载,所以我们选择自定义类加载器

代码如下

我们在pom文件中写入下面的代码

xml 复制代码
<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
java 复制代码
package org.JVM;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;

public class MyClassLoader extends ClassLoader{

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException{

        //com . yupi . springbootinit . MainApplication .class
        String fileName = name.substring(name.lastIndexOf(".")+1)+".class";

        byte[] bytes=new byte[0];
        try {
            bytes= FileUtils.readFileToByteArray(new File("F:\\jvm\\data\\"+fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return defineClass(name, bytes, 0, bytes.length);
    }

    public static void main(String[] args) throws ClassNotFoundException {
        MyClassLoader myClassLoader = new MyClassLoader();

        Class<?> clazz =  myClassLoader.loadClass("com.yupi.springbootinit.MainApplication");

        //打印类的字段
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field.getName());
        }

        //打印类加载器的名称
        System.out.println(clazz.getClassLoader());
    }
}

我们来到jclasslib里面看一下,发现如此

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

相关推荐
信誓旦旦的程序猿3 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河3 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年3 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym3 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen3 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室3 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy3 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
quantdash_cc3 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun4 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统
把我格子衫拿来4 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化