自定义类加载器

简介: 自定义类加载器

什么时候需要类加载器?

  • 想加载非classpath随意路径中的类文件
  • 都是通过接口来实现,希望解耦时候,常用在框架设计
  • 这些类希望予以隔离,不同应用的同类名都可以加载,不冲突

步骤

  • 1.继承ClassLoader父类
  • 2.要遵从双亲委派机制,重写findClass方法
    注意不是重写loadClass,否则不会走双亲委派的机制
  • 3.读取类文件的字节码
  • 4.调用父类的defineClass方法来加载类
  • 5.使用者调用类加载器器的loadClass方法

需求与实现

我们自己约定的需求如下,我们从外部路径/tmp/myclasspath/加载类

具体实现如下:

public class MyClassLoader extends ClassLoader{ //继承ClassLoader父类
    /**
     * name就是类名称
     */
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        String path="/tmp/myclasspath/"+name+".class";
        System.out.println("path:"+path);
        ByteArrayOutputStream os=new ByteArrayOutputStream();
        try {
            Files.copy(Paths.get(path),os);
            byte[] bytes=os.toByteArray();

            //byte[] -> *.class
            return  defineClass(name,bytes,0,bytes.length);//父类中的defineClass加载,如果找不到会调用本类的defineClass进行加载
        } catch (IOException e) {
            e.printStackTrace();
            throw new ClassNotFoundException("类文件未找到",e);
        }
    }
}

代码测试:

 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        MyClassLoader classLoader=new MyClassLoader();
        Class<?> c1=classLoader.loadClass("HelloWorld");
        Class<?> c2=classLoader.loadClass("HelloWorld");
        System.out.println(c1==c2);
        c1.newInstance();
        //System.out.println(c1.newInstance());
    }

我们在路径下面定义下类:

运行结果:

true

小总结

  • 自定义加载类的需求主要来自需要从外部加载类运行的时候,我们很常见的场景就是Tomcat的lib类,还有类似rpc调用的时候,类的实现有时候是从网络中传输过来的
  • 双亲委派的机制其实就是一个递归调用的机制,父类先寻找加载的类,如若没有找到,则用当前类加载器去加载,这个的结果就是,如果提前加载过了,则不会在继续被加载,保证了类的版本一致性
目录
相关文章
|
3月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
269 100
|
3月前
|
弹性计算 网络协议 Linux
阿里云服务器简介及使用教程,附送云服务器ECS自定义创建流程
阿里云ECS是安全可靠、弹性灵活的云计算服务,支持多种实例规格与操作系统,可快速创建和管理云服务器。本文详解ECS介绍、购买流程及使用教程,涵盖配置选择、网络设置、安全组规则等,助您轻松上手。
454 16
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
12_机器翻译入门:多语言LLM应用
在全球化背景下,语言障碍一直是信息交流、商业合作和文化传播的重要阻碍。2025年,随着多语言大语言模型(LLM)技术的突破,机器翻译已经从简单的单词转换发展为能够理解上下文、处理复杂句式、适应文化差异的智能系统。本文将带您入门多语言LLM在机器翻译领域的应用,重点介绍使用mT5(多语言T5)模型实现英语到中文的翻译,并探讨文化适应等高级话题。
|
12月前
|
弹性计算 运维 安全
云上DevOps自动化的最佳实践
本文介绍了云上DevOps自动化最佳实践,重点探讨了企业在上云过程中面临的成本管理、运维效率和弹性等问题。通过阿里云的产品和服务,企业可以实现自动化的资源管理、成本优化和高效运维。文章详细阐述了如何利用标签进行成本分析、选择合适的付费类型和实例规格、以及通过弹性伸缩降低成本。此外,还介绍了新功能发布,如统一的实例运维通道界面、AI辅助的运维工具等,帮助企业提升云上业务的管理和运营效率。
|
8月前
|
监控 安全 测试技术
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
224 14
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
|
6月前
|
SQL 前端开发 Java
如何开发供应商管理系统中的发货协同板块(附架构图+流程图+代码参考)
本文讲述了老王因供应商发货信息不同步导致客户投诉的经历,引出供应商管理系统中“发货协同”模块的重要性。文章结合实际案例,详细介绍了该模块的功能设计、业务流程、技术实现及开发技巧,并通过上线效果展示其对发货效率和客户满意度的显著提升。最后提供常见问题的解决方案,助力企业实现发货全流程透明化管理。
|
6月前
|
人工智能 自然语言处理 API
全球化3.0时代:如何用技术破解跨境电商的“多语言+多货币”魔咒?
本文详解从0到1构建高并发跨境电商代购系统的技术方案,涵盖微服务架构设计、数据库优化、高并发处理、商品采集、订单处理、全球物流追踪等核心技术,结合实战案例与未来趋势,助力企业打造支持10万级订单/秒的弹性系统,适应全球化与数字化贸易需求。
|
12月前
|
Linux 网络安全 开发工具
[Git] 如何理解及基础操作
Git 是一种分布式版本控制系统,帮助记录文件的历史和变化,支持多人协作。它由 Linus Torvalds 于 2005 年创建,旨在高效管理大型项目。Git 的核心操作包括 `add`、`commit` 和 `push`,分别用于添加文件、提交更改和同步远程仓库。GitHub 是基于 Git 的云端平台,用户可以在上面保存和分享代码。通过简单的命令如 `git status`、`git log` 等,可以轻松管理项目版本。安装 Git 可在不同操作系统上通过命令行或官网下载完成。掌握这些基础操作后,用户可以高效地进行版本管理和协同开发。
[Git] 如何理解及基础操作
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
1068 0
|
机器学习/深度学习 人工智能 自动驾驶
深入理解深度学习中的卷积神经网络(CNN)
【10月更文挑战第18天】深入理解深度学习中的卷积神经网络(CNN)
505 0