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

网站建设高端培训学校浏览器里面信息是真是假

网站建设高端培训学校,浏览器里面信息是真是假,页面跳转流程图,浙江银安建设有限公司网站上期文章内容:JVM类加载过程详解:从字节码到内存的蜕变之旅 目录 一、类加载器的本质是什么? 二、类加载机制全景 1.1 三阶段生命周期 1.2 关键数据结构 三、类加载器体系架构 2.1 四层标准类加载器 2.2 类加载器树形结构 四、双亲委派…

上期文章内容:JVM类加载过程详解:从字节码到内存的蜕变之旅


目录

一、类加载器的本质是什么?

二、类加载机制全景

1.1 三阶段生命周期

1.2 关键数据结构

三、类加载器体系架构

2.1 四层标准类加载器

2.2 类加载器树形结构

四、双亲委派模型

4.1 定义

4.2 核心算法与工作流程

4.2 设计价值

4.3 破坏条件与场景

五、实战开发指南

4.1 自定义类加载器模板

4.2 线程上下文类加载器

4.2.1 概念剖析

4.2.2 Spring框架中的深度应用

4.2.2.1 核心作用

4.2.2.2 实现原理

4.2.2.3 典型场景

4.2.3 开发注意事项

4.2.3.1 潜在陷阱

4.2.3.2 最佳实践


一、类加载器的本质是什么?

类加载器(ClassLoader) 是JVM的 核心组件之一,它的核心职责是:
将字节码文件(.class)动态加载到内存中,并转换为JVM可以执行的 Class 对象
简单来说,类加载器就是JVM的“搬运工”——把外部的类文件搬进内存,并生成对应的类结构。

二、类加载机制全景

1.1 三阶段生命周期

类加载过程分为三个阶段:

  1. 加载(Loading)
    • 通过全限定名获取字节流(支持网络/Native)
    • 转换为方法区结构
    • 创建 Class 对象作为入口
  2. 链接(Linking)
    • 验证(Verification):字节码合规性检查
    • 准备(Prepare):分配静态字段初始值
    • 解析(Resolve):符号引用转直接引用
  3. 初始化(Initialization)
    • 执行静态块和静态变量赋值

1.2 关键数据结构

  • 方法区:存储类元数据(JDK8后元空间替代)
  • Class对象:每个类唯一实例,包含:
private final ClassLoader classLoader;
private final String name;
private volatile Class superclass;
// ...其他成员

三、类加载器体系架构

2.1 四层标准类加载

类加载器责任范围实现方式
Bootstrap ClassLoaderJVM核心类库(rt.jar等)C++实现
Platform ClassLoader扩展类库(ext目录)Java实现
Application ClassLoader应用类路径(classpath)Java实现
Custom ClassLoader用户自定义加载需求继承ClassLoader实现

关键特性

  • 启动类加载器无父节点(返回null)
  • 所有上层类加载器均为下层父节点
  • 通过getParent()追溯加载链

2.2 类加载器树形结构

四、双亲委派模型

4.1 定义

双亲委派模型 是类加载器的协作规则:
当一个类加载器收到加载请求时,它不会自己处理,而是将请求依次传递给父类加载器,直到顶层启动类加载器。只有父类加载器无法找到时,子类加载器才会尝试加载。

4.2 核心算法与工作流程

protected Class<?> loadClass(String name, boolean resolve) {// ① 已加载检查Class<?> c = findLoadedClass(name);if (c == null) {// ② 委派父加载器if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}if (c == null) {// ③ 自己加载c = findClass(name);}}// ④ 解析类if (resolve) resolveClass(c);return c;
}
双亲委派模型执行流程

4.2 设计目标

  • 安全保障:防止核心API被篡改
  • 避免重复加载:统一管理类加载
  • 命名空间隔离:不同加载器加载同名类视为不同类

4.3 破坏条件与场景

破坏方式典型应用场景
重写loadClass()SPI框架(如JDBC驱动加载)
利用线程上下文类加载器Tomcat/WAS等应用服务器
父加载器为空指针自定义根加载器

五、实战开发指南

4.1 自定义类加载器模板

public class MyClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {// ① 添加类名校验逻辑(防止非法类加载)if (!name.startsWith("com.example")) {throw new ClassNotFoundException("Invalid class name: " + name);}byte[] bytes = loadBytesFromNetwork(name); //自定义加载逻辑return defineClass(name, bytes, 0, bytes.length);}private byte[] loadBytesFromNetwork(String className) {try {URL url = new URL("http://example.com/classes/" + className.replace('.', '/') + ".class");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();if (responseCode != HttpURLConnection.HTTP_OK) {throw new IOException("Failed to load class: " + className);}ByteArrayOutputStream outputStream = new ByteArrayOutputStream();InputStream inputStream = connection.getInputStream();byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}return outputStream.toByteArray();} catch (IOException e) {throw new ClassNotFoundException("Network error while loading class: " + name, e);}}
}

关键增强点

  1. 类名白名单校验(安全防护)
  2. 完整的网络请求实现(支持HTTP协议)
  3. 异常链处理(保留原始异常信息)

4.2 线程上下文类加载器

4.2.1 概念剖析

        线程上下文类加载器(Thread Context ClassLoader)是JVM提供的一种动态绑定机制,允许在运行期动态改变某个线程的类加载器。通过 Thread.currentThread().getContextClassLoader() 获取当前线程绑定的类加载器。

设计初衷
        解决传统双亲委派模型在某些场景下的局限性,典型案例如 SPI(Service Provider Interface)服务加载和多层容器架构(如Tomcat)。


4.2.2 Spring框架中的深度应用
4.2.2.1 核心作用

Spring通过上下文类加载器实现以下目标:

  1. 隔离性保障
    Web应用中可能存在多个第三方库版本冲突,通过为每个Web应用分配独立的上下文类加载器(如Tomcat的 WebAppClassLoader),可以实现类隔离。

  2. 灵活加载策略
    当Spring需要加载应用类时(而非核心框架类),它会优先使用当前线程的上下文类加载器,从而正确找到应用类路径中的类。

4.2.2.2 实现原理
  1. 类加载器切换
    Tomcat在启动Web应用时,会为每个应用线程设置上下文类加载器为对应的 WebAppClassLoader

  2. Spring的类加载逻辑
    Spring通过 ClassUtils.getDefaultClassLoader() 方法获取当前线程的上下文类加载器:

    public static ClassLoader getDefaultClassLoader() {ClassLoader cl = null;try {cl = Thread.currentThread().getContextClassLoader();} catch (IllegalStateException ex) { // Should not happen// fallback to system classloadercl = ClassLoader.getSystemClassLoader();}if (cl == null) {cl = ClassLoader.getSystemClassLoader();}return cl;
    }
4.2.2.3 典型场景

场景1:加载应用类
当Spring需要实例化 com.example.MyService 时:

// 使用上下文类加载器加载
Class<?> clazz = ClassUtils.forName("com.example.MyService", getClassLoader());
MyService instance = (MyService) clazz.getDeclaredConstructor().newInstance();

场景2:加载第三方SPI实现
JDBC驱动注册时:

DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
// DriverManager内部使用上下文类加载器加载驱动实现类

4.2.3 开发注意事项
4.2.3.1 潜在陷阱
  1. 类加载器泄漏
    长生命周期线程(如HTTP请求线程)未及时清除上下文类加载器,可能导致内存泄漏。

  2. 版本冲突
    不同线程设置不同的上下文类加载器时,需确保类强唯一性(避免同名类被不同加载器加载)。

4.2.3.2 最佳实践
  1. 使用范围限定
    仅在必要时修改上下文类加载器,并在操作完成后恢复:

    ClassLoader original = Thread.currentThread().getContextClassLoader();
    try {Thread.currentThread().setContextClassLoader(myClassLoader);// 执行需要自定义加载器的代码
    } finally {Thread.currentThread().setContextClassLoader(original);
    }
  2. 优先级控制
    在自定义类加载器中添加父加载器委托逻辑:

    @Override
    protected Class<?> loadClass(String name) throws ClassNotFoundException {try {return getParent().loadClass(name);} catch (ClassNotFoundException e) {return findClass(name);}
    }



码字不易,希望可以一键三连,我们下期文章再见!!!

http://www.dtcms.com/wzjs/352653.html

相关文章:

  • 文字域名可以做网站疫情放开最新消息今天
  • 哪些网站是用twcms做的自建站平台
  • 弄美团网站的一般一个做赚多少钱青岛谷歌seo
  • dede 网站地图 调用文章google网站
  • 制作网页的网站有哪些什么是新媒体运营
  • 关于集约化建设政府网站竞价开户
  • 淘掌门官方网站搜索引擎优化要考虑哪些方面
  • 用哪个软件做网站好网页生成app
  • 做淘客的网站都有哪几个网络营销的成功案例分析
  • 建站宝盒建网站百度搜索关键词热度
  • 网站开发论坛百度贴吧热线客服24小时
  • 宁波静态网站网页建设年度关键词
  • 平远网站建设中国免费广告网
  • 做新标准大学英语网站合肥网站优化公司
  • 五合一网站建设上海公布最新情况
  • 怎么做动态网站的数据库海门网站建设
  • 万网搭建淘宝客网站聊石家庄seo
  • 派出所网站源码成品在线视频免费入口
  • 武汉企业网站设计最新清远发布
  • 网站域名备案注册证书查询市场营销在线课程
  • 电子商务网站建设评估工具有哪些东莞外贸推广公司
  • 专业酒店建设信息网站百度账号中心官网
  • 网站建设佰金手指科杰二苹果自研搜索引擎或为替代谷歌
  • 一了网站seo网站排名的软件
  • 三亚网站建设哪家好中国联通和腾讯
  • 淄博网站建设 招聘指数基金怎么买
  • 广东中山建设信息网站个人网站怎么做
  • 小宽带怎样做视频网站seo外包公司优化
  • 浏览器打开用dw做的网站说汕头百度网站推广
  • 做网站有多砸钱北京百度推广代运营