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

jvm的三种类加载器简单说明

首先来使用代码看段结果

image

 可能你啥都看不懂,我来解释下

第一行打印的是应用类加载器,一般我们自己写的java代码都是它来加载的

第二行是拓展类加载器,主要是放到jdk的lib目录给所有项目使用的

第三行就是boostrap加载器,你可以理解老祖宗,只有是null,那是因为他不是java代码写的,而是c++写的,看过jvm应该有点印象

对于第四行就涉及到双亲委派机制的解释,应用类加载器到拓展类加载器之到boostrap加载器,因为是jdk核心类,所有会由bootstrap返回

image

下面看下加载

image

 

 第一行是说这是一个接口,第二行表示java都会认为是一个类

接下来我将找到jvm实际方法解释它如何做的

image

image

image

 

 看到这里是不是有了一丢丢了解呢,下面使用简单的代码跑跑看看

image

 这里展示了程序运行用到的依赖关系

image

 这里可以看到加载时间

 如果需要直接调用,设置为true就直接解析了

代码部分

package com.java.test;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @Description:* @Author: tutu-qiuxie* @Create: 2026/4/14 0:49*/
public class Test001 {private static final Logger log= LoggerFactory.getLogger(Test001.class);public static void main(String[] args) throws Exception {MyClassLoader cl = new MyClassLoader();Class<?> clazz = cl.loadClass("com.java.test.Test001",true);//Class<?> clazz = cl.loadClass("com.java.test.Test001");Object obj = clazz.getDeclaredConstructor().newInstance();clazz.getMethod("hello").invoke(obj);}public void hello(){log.info("你好....");}}class MyClassLoader extends ClassLoader {private static final Logger log= LoggerFactory.getLogger(MyClassLoader.class);@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {log.info("🔥 自己加载类: " + name);try {//String path = "D:\\software\\idea\\jvm-test\\target\\classes\\com\\java\\test\\" + name + ".class"; // 改成你的路径String baseDir = "D:\\software\\idea\\jvm-test\\target\\classes\\";String classPath = name.replace(".", "\\") + ".class";String path = baseDir + classPath;java.nio.file.Path p = java.nio.file.Paths.get(path);byte[] bytes = java.nio.file.Files.readAllBytes(p);return defineClass(name, bytes, 0, bytes.length);} catch (Exception e) {throw new ClassNotFoundException(name);}}@Overrideprotected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {log.info("👉 loadClass: " + name + " | resolve=" + resolve);Class<?> c = findLoadedClass(name);if (c == null) {// 只拦截你自己的类if (name.startsWith("com.java.test")) {c = findClass(name);  // 🔥 走你自己的加载逻辑} else {c = super.loadClass(name, false); // JDK类走父类}}if (resolve) {log.info("🔥 resolve: " + name);resolveClass(c);}// 其他走父加载器(JDK类)return c;}
}

  pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.java</groupId><artifactId>jvm-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.14</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 或更高版本 --></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version></dependency></dependencies></project>

  而我们没法定义String这样的类,是双亲委派机制的沙箱机制起作用,

image

 当然除了反射,还有别的方式去使用,这里就是SPI机制

在使用sprincloudconfig中,当加载的配置存在中文,就会出现乱码问题,因而有了如下代码

image

实现对中文编码

 

http://www.jsqmd.com/news/637028/

相关文章:

  • 阿里云专有云网络架构
  • 书匠策AI:解锁毕业论文新姿势,让学术写作如虎添翼!
  • AI 拟人化新规落地:情感陪伴有边界,行业告别野蛮生长
  • 新手必看!Nanbeige像素游戏风AI对话前端:从零部署到完整调用的完整指南
  • AI Agent简历项目包装:如何让Demo看起来高大上
  • 【续训】接上中断的最后一次的训练续训
  • 【SpringAIAlibaba新手村系列】(18)Agent 智能体与今日菜单应用
  • 2026四川充电桩维修厂家TOP5:四川充电桩运维、四川充电设备厂家、四川充电设备安装、四川充电设备采购、四川兆瓦级充电设备选择指南 - 优质品牌商家
  • 2026眉山骨科技术解析:选对治疗机构的核心标准 - 优质品牌商家
  • 从任务型到目标导向型:AI Agent Harness Engineering 行为逻辑的进化
  • 2026义乌国际商贸城驾培教练标杆名录:佛堂驾校教练/北苑驾校教练/后宅驾校教练/国际商贸城驾校教练/廿三里驾校教练/选择指南 - 优质品牌商家
  • Linux下Logitech设备终极管理指南:Solaar如何成为你的桌面控制中心
  • 如何在Navicat中执行还原时解决字符集冲突_保障核心数据安全
  • 全网通用版|2026 年财务培训机构优缺点分析与选择指南(附选型标准)
  • 吃透这7本正版C语言教程,从小白到编程大神,别再走弯路!
  • 2026租手机平台推荐:信用免押哪家强?实测主流平台服务 - 博客湾
  • 2026年空投平台公司有哪些?3家头部合规服务商解析 - 优质品牌商家
  • 20254216 2025-2026-2 《Python程序设计》实验二报告
  • 广东增安机电消防工程有限公司
  • 马斯克版微信来了?XChat上线,野心与争议并存
  • MongoDB在云主机上部署副本集的内网外网IP怎么配置_Host解析与绑定机制
  • 统一配置mapper,不用每次在mapper层添加mapper注解
  • 2026菌草内衣品牌排行:全家贴身衣物的安心之选指南 - 优质品牌商家
  • 2026广告抽纸盒技术解析:酒店卫浴用品/酒店大堂用品/酒店客房用品/酒店日用品定制/酒店用品厂家/酒店用品定做/选择指南 - 优质品牌商家
  • 消息队列学习计划 - 阶段三:面试高频问题
  • APP Inventor蓝牙APP制作:从零到一打造专属遥控器
  • 前沿技术:边缘计算核心概念深度解析与核心优势(超详细图解+对比云计算)
  • jmeter进行数据库读取预处理转换数组传入
  • OpenAI至暗时刻!星际之门停摆,核心高管投奔Meta
  • 不止于AES:手把手教你用ChipWhisperer Jupyter Notebook定制自己的加密算法功耗采集流程