类加载实例

news/2025/3/10 17:49:39/文章来源:https://www.cnblogs.com/zeroXcofebabe/p/18763257

一、项目概述
本实例通过自定义类加载器、演示类及示例类,验证Java类加载机制中的双亲委派模型、破坏双亲委派场景,以及类加载器命名空间隔离特性。通过添加-verbose:class参数观察类加载过程,直观理解JVM类加载核心概念。


二、代码结构说明

1.自定义类加载器:CustomClassLoader

• 功能:从指定路径加载.class文件。

• 核心实现:

• 重写findClass方法,通过defineClass定义类。

loadClassData方法读取类文件字节码,拼接类路径并读取文件内容。

package com.example.jvm.loader;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;public class CustomClassLoader extends ClassLoader {private final String classPath;public CustomClassLoader(String classPath) {this.classPath = classPath;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {System.out.println("【自定义加载器】开始加载类: " + name);byte[] data = loadClassData(name);return defineClass(name, data, 0, data.length);}private byte[] loadClassData(String className) throws Exception {String path = classPath + className.replace('.', File.separatorChar) + ".class";try (FileInputStream fis = new FileInputStream(path);ByteArrayOutputStream bos = new ByteArrayOutputStream()) {byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {bos.write(buffer, 0, len);}return bos.toByteArray();}}
}

2.演示类:ClassLoadingDemo
包含三个场景,演示类加载核心特性:

场景1:正常双亲委派流程

• 逻辑:使用自定义加载器加载类,触发默认双亲委派机制。

• 代码:

System.out.println("\n==== 场景1:正常类加载流程 ====");
CustomClassLoader loader1 = new CustomClassLoader("d:\\project\\Jvm\\out\\production\\classes\\");
Class<?> clazz1 = loader1.loadClass("com.example.jvm.demo.SampleClass");
System.out.println("类加载器: " + clazz1.getClassLoader());

场景2:破坏双亲委派机制

• 逻辑:重写loadClass方法,绕过双亲委派,直接由自定义加载器加载指定类。

• 代码:

System.out.println("\n==== 场景2:破坏双亲委派 ====");
CustomClassLoader loader2 = new CustomClassLoader("d:\\project\\Jvm\\out\\production\\classes\\") {@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {if (name.startsWith("com.example.jvm")) {return findClass(name); // 直接加载,破坏双亲委派}return super.loadClass(name);}
};
Class<?> clazz2 = loader2.loadClass("com.example.jvm.demo.SampleClass");
System.out.println("破坏委派后加载器: " + clazz2.getClassLoader());

场景3:命名空间隔离

• 逻辑:使用不同自定义加载器实例加载同类,验证JVM将其视为不同类。

• 代码:

System.out.println("\n==== 场景3:命名空间隔离 ====");
CustomClassLoader loader3 = new CustomClassLoader("d:\\project\\Jvm\\out\\production\\classes\\");
CustomClassLoader loader4 = new CustomClassLoader("d:\\project\\Jvm\\out\\production\\classes\\");
Class<?> clazz3 = loader3.loadClass("com.example.jvm.demo.SampleClass");
Class<?> clazz4 = loader4.loadClass("com.example.jvm.demo.SampleClass");
System.out.println("相同加载器实例: " + (clazz3 == clazz4)); // false,不同加载器实例加载的类不同
System.out.println("不同加载器实例: " + (loader3 == loader4)); // false

3.示例类:SampleClass

• 功能:作为被加载的类,包含静态初始化块,验证类加载时的初始化行为。

• 代码:

package com.example.jvm.demo;public class SampleClass {static {System.out.println("【类初始化】SampleClass被加载");}public void hello() {System.out.println("Hello from SampleClass!");}
}

三、运行现象总结

• 默认加载:未破坏双亲委派时,类由AppClassLoader(应用类加载器)加载。

• 破坏委派:重写loadClass后,类直接由自定义加载器加载。

• 命名空间隔离:不同自定义加载器实例加载的同类,在JVM中视为不同类(clazz3 == clazz4结果为false)。

通过本实例,直观验证了双亲委派机制、类加载器命名空间隔离等JVM类加载核心概念。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度测评国产 AI 程序员,在 QwQ 和满血版 DeepSeek 助力下,哪些能力让你眼前一亮?

通义灵码上新模型选择功能,不仅引入了 DeepSeek 满血版 V3 和 R1 这两大 “新星”,Qwen2.5-Max 和 QWQ 也强势登场,正式加入通义灵码的 “豪华阵容”。开发者只需在通义灵码智能问答窗口的输入框中,单击模型选择的下拉菜单,便能轻松开启不同模型,畅享个性化服务。通义灵码…

AI Station使用笔记

一、安装maui (1)在104上,终端操作(必须有sudo权限):sudo apt install cifs-utilspip install maui==0.0.32 -i http://10.9.54.102:8888/simple --trusted-host 10.9.54.102 maui login (fang.wang03,密码为开机密码) maui project init RC_Collaboratives (前…

mysql索引浅谈

一. 索引: 索引是数据库中重要的数据结构,主要作用是提高查询的效率。索引相当于书本的目录,即可以快速定位所需数据的位置,而不用逐页查找。 二. 索引底层结构:索引底层主要采用B+树来实现索引的管理。B+树内部分为叶子节点和非叶子节点;非叶子节点主要用来存储索引和指…

java 常用注解记录汇总

1.@Transactional 可放在类或者方法上 2.@JsonFormat 一般用于格式化时间字段属性 3.@JsonProperty 和 @JSONField 前者是Jackson框架后者是阿里的 用法都是属性名之间的映射,场景多用于接口对接 说明: 比如和对方系统进行接口对接时,可能对方的字段名叫做 chinese_name和…

数据库索引简单介绍

数据库索引 基本概念索引本质是一种可以提升数据查询效率的数据结构主要分类 主要分为两类:聚簇(集)索引:一个叶子节点上存储的是索引(主键值)和数据为对应的行数据 非聚簇(集)索引:一个叶子节点上存储的是索引(某一个字段的值)和数据为对应的主键值B+树索引采用的数…

雅马哈机器人E17故障排除案例参考

雅马哈机器人E17故障是一个与电机控制相关的报警,它包含许多特定的故障代码,例如E17.410、E17.411、E17.802、E17.902、E17.905、E17.915等。 故障排除步骤数据备份:出现故障时,尽快备份数据。 诊断工具:使用教学设备或计算机软件进行诊断,浏览系统的所有故障类型和信息,…

记录---前端实现水印功能

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣前段时间突然接到一个需求,项目中要实现特定水印功能,不同的用户查看时展示用户特有的水印,这样可以在资源外流的时候追究到责任人。 查找搜集了很多方法,有通过CSS伪元素添加水印的、还可以使用CSS重复背景图片、还有…

IDEA2024破解方法

一、下载链接 IDEA2024.2.3: https://www.jetbrains.com/idea/download/other.html 破解脚本和激活码:https://wwpf.lanzouv.com/iZtCB2q6xmwh 二、运行破解脚本 运行 三、输入激活码 激活码位置:

关于举办2024年全国青少年 人工智能创新实践交流展示活动的通知

首页课程项目工具数据集AI 体验读本活动 注册登录“与AI共创未来” 2024年全国青少年人工智能创新实践活动【主办单位】中国科协青少年科技中心、中国青少年科技教育工作者协会、上海人工智能实验室、江苏省科协 【支持单位】中国公众科学素质促进联合体 【承办单位】各省级科…

SRA数据下载丢失质量值信息

001、SRA数据下载丢失质量值信息 使用的转换命令如下: fastq-dump --gzip --split-files -A sample_name sample_name.lite.1zcat SRR17344673_1.fastq.gz | head -n 4 002、解决方法: a、改用EBI数据库:https://www.ebi.ac.uk/ena/browser/viewb、使用 pfastq-dump 进行转…

浏览器插件使用

具体下载——插件小屋 https://www.chajianxw.com/developer/83894.html 在对应的地方填上指定的 header,可以在请求头查看当前的header是否有 新加坡的地址查看当前头部 有 灰度环境 声明 欢迎转载,但请保留文章原始出处:) 博客园:https://www.cnblogs.com/chenxiaomeng/ 如出…

FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战

title: FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战 🚀 date: 2025/3/10 updated: 2025/3/10 author: cmdragon excerpt: 本教程深入探讨 FastAPI 中参数别名与自动文档生成的核心机制,涵盖从基础操作到高级用法。通过详细的代码示例、课后测验和常见错误解…