自定义类加载器

简介: 自定义类加载器

什么时候需要类加载器?

  • 想加载非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调用的时候,类的实现有时候是从网络中传输过来的
  • 双亲委派的机制其实就是一个递归调用的机制,父类先寻找加载的类,如若没有找到,则用当前类加载器去加载,这个的结果就是,如果提前加载过了,则不会在继续被加载,保证了类的版本一致性
目录
相关文章
|
Java
自定义类加载器实现热加载
自定义类加载器实现热加载
98 0
|
前端开发 Java 开发者
什么是类加载器,类加载器有哪些?
什么是类加载器,类加载器有哪些?
86 0
|
前端开发 Java 数据库
什么是类加载器?类加载器有哪些?
类加载器(ClassLoader)是Java虚拟机(JVM)的一部分,用于将类的字节码加载到内存中,并生成对应的Class对象。类加载器负责查找、加载和链接类的过程。
239 0
|
安全 前端开发 Java
双亲委派模型与类加载器
我们都知道类都是通过类加载器被加载进虚拟机中的,那这个类加载器有哪些呢?我们平时写的代码又是通过什么类加载器被加载进虚拟机中的呢?类加载器的工作模式又是什么呢?带着疑问一起去学习下双亲委派模型与类加载器。
128 0
双亲委派模型与类加载器
|
Java 应用服务中间件 数据库
类加载器系列(三)——如何自定义类加载器
类加载器系列(三)——如何自定义类加载器
1275 0
类加载器系列(三)——如何自定义类加载器
|
安全 前端开发 Java
双亲委派模型与自定义类加载器
双亲委派模型与自定义类加载器
双亲委派模型与自定义类加载器
|
缓存 前端开发 Java
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 中
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 中
124 0
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 中
|
Java
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 下
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 下
99 0
|
Java 编译器 API
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 上
37. 请你详细说说类加载流程,类加载机制及自定义类加载器 上
93 0