jvm基础三——类加载器

类加载器

在Java中,类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将类文件(.class文件)加载到JVM中,使得程序能够使用这些类。类加载器在Java中具有重要的作用,它的主要任务包括:

  1. 加载(Loading):找到并加载类文件的字节码数据。类加载器根据类的全限定名(Fully Qualified Name)来查找并读取对应的类文件。

  2. 链接(Linking):链接包括验证、准备和解析这三个步骤。

    • 验证(Verification):确保类文件的字节码符合JVM规范,并且安全地加载到JVM中。
    • 准备(Preparation):为类的静态变量分配内存,并设置默认初始值。
    • 解析(Resolution):将符号引用转换为直接引用。
  3. 初始化(Initialization):对类进行初始化,包括执行静态代码块和初始化静态变量等。

Java的类加载器采用了双亲委派模型(Parent Delegation Model)。根据这个模型,当需要加载一个类时,类加载器首先会委派给父类加载器加载,只有在父类加载器无法加载该类时,才会尝试自己加载。这种层次化的类加载器体系保证了类的统一性和安全性,同时也避免了类的重复加载。

Java中的类加载器可以分为以下几种类型:

  1. Bootstrap Class Loader(引导类加载器):是JVM的一部分,它负责加载JVM自身需要的类,包括java.lang包中的类。它是用本地代码(Native Code)实现的,无法直接在Java中获取对其的引用。

  2. Extension Class Loader(扩展类加载器):负责加载Java的扩展库,位于JRE的lib/ext目录下的类。它是由sun.misc.Launcher$ExtClassLoader类实现的,是Bootstrap Class Loader的子类。

  3. Application Class Loader(应用程序类加载器):也叫系统类加载器,负责加载应用程序中的类。它是由sun.misc.Launcher$AppClassLoader类实现的,是Extension Class Loader的子类。

  4. 自定义类加载器:Java允许用户自定义类加载器,继承自java.lang.ClassLoader类,实现自定义的加载逻辑。通过自定义类加载器,可以实现一些特殊的类加载需求,比如从网络、数据库或其他非标准位置加载类。

Java的类加载器机制为Java程序提供了灵活性和安全性,可以根据不同的需求扩展或自定义类加载器,实现各种复杂的类加载逻辑

 

类加载器的双亲委派机制 

Java中的类加载器采用了双亲委派机制(Parent Delegation Model),这是一种类加载器的工作原则,用于保证类加载的统一性和安全性。该机制基于一个简单的原则:除非父类加载器无法加载该类,否则由父类加载器加载。

下面是双亲委派机制的工作流程:

  1. 当一个类加载器收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把请求委托给父类加载器去完成。

  2. 每个类加载器都会把加载请求向上委托给父类加载器,直到达到顶层的引导类加载器(Bootstrap Class Loader)。

  3. 如果父类加载器可以加载这个类,就成功返回;如果父类加载器无法加载,子类加载器才会尝试自己去加载这个类。

这种机制的优势在于确保了Java核心库的一致性:无论哪个类加载器加载一个类,最终被加载的类都是相同的。这样可以避免在不同的类加载器下出现同名类的冲突问题。

双亲委派机制还提高了安全性。因为在这种机制下,Java类的加载都是从根加载器开始的,根加载器只加载标准的核心Java类库,不会加载应用程序的类。这样可以防止应用程序通过替换核心Java类库中的类来破坏JVM的稳定性和安全性。

总的来说,双亲委派机制保证了类加载的一致性、安全性和稳定性,是Java类加载机制的核心之一。

打破

尽管双亲委派机制在大多数情况下都是非常有用的,但在某些特殊情况下,可能需要打破双亲委派机制。打破双亲委派机制通常是为了实现一些特殊的类加载需求,比如热部署、动态更新等。

在Java中,要打破双亲委派机制,一般需要自定义类加载器,并重写其加载类的方法。下面是一种可能的方法:

  1. 自定义类加载器:继承自 ClassLoader 类,并重写 loadClass() 方法

  2. loadClass() 方法中,根据需要的加载策略,决定是否调用父类加载器的 loadClass() 方法。

  3. 如果需要打破双亲委派机制,可以在自定义类加载器的 loadClass() 方法中直接加载指定类,而不是委托给父类加载器。

下面是一个简单的示例代码,演示如何打破双亲委派机制:

public class MyClassLoader extends ClassLoader {

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        if (name.startsWith("com.example")) {
            // 对于指定的类,直接由自定义类加载器加载
            return findClass(name);
        }
        // 其他类委托给父类加载器加载
        return super.loadClass(name);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // 实现自定义的类加载逻辑,比如从文件或网络加载类的字节码数据
        // 这里只是一个简单示例,实际应用中需要根据具体需求实现
        byte[] classData = getClassData(name);
        if (classData == null) {
            throw new ClassNotFoundException(name);
        }
        return defineClass(name, classData, 0, classData.length);
    }

    // 实现获取类字节码数据的方法,这里只是一个简单示例,实际应用中需要根据具体需求实现
    private byte[] getClassData(String name) {
        // 从指定的位置获取类字节码数据
        // 这里可以是文件、网络等来源
        return null;
    }
}

在上面的示例中,自定义了一个 MyClassLoader 类继承自 ClassLoader,重写了 loadClass() 方法和 findClass() 方法。在 loadClass() 方法中,指定了对于以 "com.example" 开头的类,直接由自定义类加载器加载,而对于其他类,委托给父类加载器加载。在 findClass() 方法中,实现了加载类的具体逻辑,可以从指定的位置获取类的字节码数据并定义类。

需要注意的是,打破双亲委派机制可能会导致类加载冲突和安全问题,因此应谨慎使用,并确保了解其潜在的影响。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类

文章目录 相关论文摘要引言类别嵌入局限性——问题1普通ZSL模型局限性——问题2自动属性注释过程——对应问题1深度语义-视觉对齐&#xff08;DSVA&#xff09;模型——对应问题2 基于遥感多模态相似性的自动属性标注属性词汇表构造使用CLIP模型自动标注属性对CLIP模型进行训练…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--初尝php

初尝php 打开你下载的wordpress文件夹&#xff0c;如果你用的xampp那它就在xampp安装的文件夹–htdocs文件夹–你可以新建一个test文件夹–新建一个test.php文件 <html><head><title>First attempt at PHP</title></head><body><?ph…

52岁TVB前绿叶退隐8年转做司仪晒流利英文。

现年52岁的陈霁平&#xff08;Maria&#xff09;在1995年参选港姐后加入TVB&#xff0c;离巢后转型做专业司仪&#xff0c;精通多国语言的她更成为司仪界的抢手货。 日前陈霁平分享了担任活动主持的近照&#xff0c;身穿高衩晚装的她身形Fit爆&#xff0c;皮肤依然白滑紧致&…

2024最新在线工具箱/ 站长IT工具箱/网站系统源码下载

2024最新在线工具箱/ 站长IT工具箱/网站系统源码下载- 更多详情及下载地址请访问https://a5.org.cn/a5_ziyuan/39525.html 转载请注明出处!

前端与后端协同:实现Excel导入导出功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

详解 Redis 在 Ubuntu 系统上的安装

在 Ubuntu 20.04 安装 Redis 1. 先切换到 root 用户 在 Ubuntu 20.04 中&#xff0c;可以通过以下步骤切换到 root 用户&#xff1a; 输入以下命令&#xff0c;以 root 用户身份登录&#xff1a; sudo su -按回车键&#xff0c;并输入当前用户的密码&#xff08;即具有 sudo…

解决nginx代理后,前端拿不到后端自定义的header

先说结论&#xff0c;因为前端和nginx对接&#xff0c;所以需要在nginx添加如下配置向前端暴露header add_header Access-Control-Expose-Headers Authorization 排查过程 1.后端设置了Authorization 的响应头作为token的返回&#xff0c;前后端本地联调没有问题 response.s…

Java_自定义实体类的列表List<T>调用remove()失败讲解

示例1 前提&#xff1a; 新建一个主类Demo1。 需求&#xff1a; 在一个列表中有三条String的数据&#xff0c;想要使用remove(Object o)删掉其中一条。 结果&#xff1a; remove(Object o)成功把数据删掉。 示例2 前提&#xff1a; 新建一个自定义实体类DataExample和一个主…

ObjectiveC-10-OOP面向对象程序设计-分类/类别

类别(Category)是OjectiveC的一个特性&#xff0c;主要目的是让开发者可以以模块的形式向类添加方法&#xff08;扩展&#xff09;&#xff0c;创建标准化的方法列表供给其他人实现。 有些文档也会翻译成类别&#xff0c;其实是一个意思。 概述 语法说明 类别提供了一个简单的…

Vue3从入门到实战:掌握状态管理库pinia(下部分)

1.storeToRefs 在Count.vue文件中 显的冗余了&#xff0c;如何更加优雅简化代码。用storeToRefs 补充&#xff1a; 为什么不用ToRefs呢&#xff1f; 使用的话会将所有数据都用ref引用包裹&#xff0c;其实方法等是没必要包裹的&#xff0c;具有一定风险 2.getters的使用 …

使用Arcpy进行数据批处理-批量裁剪

时空大数据使我们面临前所未有的机遇和挑战&#xff0c;尤其在地学、遥感或空间技术等专业领域&#xff0c;无疑是一个全新的时代。 伴随着时空大数据的到来&#xff0c;海量数据的处理是一个所有科研工作者都无法忽视的重要问题。传统的数据&#xff08;主要指空间数据&#x…

选择企业邮箱,扬帆迈向商务新纪元!

企业邮箱和个人邮箱不同&#xff0c;它的邮箱后缀是企业自己的域名。企业邮箱供应商一般都提供手机app、桌面端、web浏览器访问等邮箱使用途径。那么什么是企业邮箱&#xff1f;如何选择合适的企业邮箱&#xff1f;好用的企业邮箱应具备无缝迁移、协作、多邮箱管理等功能。 企…

后端开发框架Spring Boot快速入门

写在前面 推荐将本文与Spring Boot 相关知识和工具类一文结合起来看&#xff0c;本文为主&#xff0c;上面那篇文章为辅&#xff0c;一起食用&#xff0c;以达到最佳效果&#xff0c;当然&#xff0c;大佬随意。 IDEA创建Spring Boot工程 关于Spring Boot框架项目&#xff0…

Go协程池gopool源码解析

1、gopool简介 Repository&#xff1a;https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

数的基础概念

数的基本概念 结点 每一个圆圈就表示一个结点&#xff0c;每个结点里而会存放一些数据(点权值) 边 连接两个结点的一条线&#xff0c;我们认为上面的是父亲&#xff0c;下面的是儿子&#xff0c;边也可以存储权值(边权)。在树中&#xff0c;边的条数严格等于点…

探索未来智慧酒店网项目接口架构

在数字化时代&#xff0c;智慧酒店已成为酒店业发展的重要趋势之一。智慧酒店网项目接口架构作为支撑智慧酒店运营的核心技术之一&#xff0c;其设计和优化对于提升用户体验、提高管理效率具有重要意义。本文将深入探讨智慧酒店网项目接口架构的设计理念和关键要素。 ### 智慧…

备战蓝桥杯---线段树应用2

来几个不那么模板的题&#xff1a; 对于删除&#xff0c;我们只要给那个元素附上不可能的值即可&#xff0c;关键问题是怎么处理序号变化的问题。 事实上&#xff0c;当我们知道每一个区间有几个元素&#xff0c;我们就可以确定出它的位置&#xff0c;因此我们可以再维护一下前…

Unity 代码控制播放序列帧动画的实现

在Unity中有些应用场景的动画是通过序列帧实现的。 如下图即为一个英雄攻击的一个动画&#xff1a; 那么如何实现该序列帧动画的播放呢&#xff0c;我们可以通过代码来控制播放。 1、把以上序列帧导入编辑器中&#xff0c;并修改图片属性&#xff0c;如下图所示&#xff0c;其…

利用Idea实现Ajax登录(maven工程)

一、新建一个maven工程&#xff08;不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客&#xff09;&#xff0c;工程目录如图 ​​​​​​​ js文件可以上up网盘提取 链接&#xff1a;https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…

UI自动化测试重点思考(上)--元素定位/验证码/测试框架

UI自动化测试重点思考--元素定位 Selenium定位元素selenium中如何判断元素是否存在&#xff1f;定位页面元素webdriver打开页面id定位name定位class_name定位tag_name 定位xpath定位css_selector定位link_text 定位partial_link 定位总结 selenium中元素定位的难点&#xff1f;…