自定义类加载器

简介: 自定义类加载器

什么时候需要类加载器?

  • 想加载非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调用的时候,类的实现有时候是从网络中传输过来的
  • 双亲委派的机制其实就是一个递归调用的机制,父类先寻找加载的类,如若没有找到,则用当前类加载器去加载,这个的结果就是,如果提前加载过了,则不会在继续被加载,保证了类的版本一致性
目录
相关文章
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
991 0
|
机器学习/深度学习 人工智能 自动驾驶
深入理解深度学习中的卷积神经网络(CNN)
【10月更文挑战第18天】深入理解深度学习中的卷积神经网络(CNN)
468 0
|
C# UED 开发者
WPF动画大揭秘:掌握动画技巧,让你的界面动起来,告别枯燥与乏味!
【8月更文挑战第31天】在WPF应用开发中,动画能显著提升用户体验,使其更加生动有趣。本文将介绍WPF动画的基础知识和实现方法,包括平移、缩放、旋转等常见类型,并通过示例代码展示如何使用`DoubleAnimation`创建平移动画。此外,还将介绍动画触发器的使用,帮助开发者更好地控制动画效果,提升应用的吸引力。
700 0
|
架构师 程序员
谈谈技术能力
在程序员中,围城现象非常严重,是技术人在职业发展过程中必定会面临的困境。但要回答清楚这个问题,其根源不在于是写不写代码或者代码量的多少,其本质还是要回到什么叫技术能力以及如何提升技术能力这个根节点上来。我把我的一些观察和思考总结下来,供大家参考。
1332 84
谈谈技术能力
|
机器学习/深度学习 人工智能 自然语言处理
【GitHub Copilot X】基于GPT-4的全新智能编程助手
【GitHub Copilot X】基于GPT-4的全新智能编程助手
1018 1
|
数据采集 机器学习/深度学习 运维
《数据中台架构:企业数据化最佳实践》:感受数据中台建设五步法
《数据中台架构:企业数据化最佳实践》:感受数据中台建设五步法
1589 0
《数据中台架构:企业数据化最佳实践》:感受数据中台建设五步法
【致敬童年】HTML5+canvas 实现赛车游戏
爱好赛车竞速游戏的玩家们以体验比赛中的刺激为乐趣,玩家唯一的真实目的就是“最快”。希望爱好赛车的朋友在摸鱼的阶段可以试玩哈
【致敬童年】HTML5+canvas 实现赛车游戏
|
存储 JSON 物联网
设备影子 | 学习笔记
快速学习 设备影子
862 0
设备影子 | 学习笔记
|
Web App开发 Ubuntu Linux
ubuntu20.04入门----安装QQ,微信,搜狗等
ubuntu20.04入门----安装QQ,微信,搜狗等
906 0
ubuntu20.04入门----安装QQ,微信,搜狗等