美文网首页
实现一个自定义类加载器

实现一个自定义类加载器

作者: 糯米团子123 | 来源:发表于2022-08-18 17:22 被阅读0次

实现一个自定义类加载器,加载自定义目录下的类。

  1. 要读取的自定义目录的类
package com.test
public class MyClassLoaderTest {
    private String value = "测试自定义类加载器的自定义类";
}

  1. 自定义ClassLoader
public class MyClassLoader extends ClassLoader{
    // 类的加载路径
    private String path = "E:/test/";

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {

        // 检查本地缓存是否已经被加载过
       Class<?> cls = findLoadedClass(name);
       if(cls != null){
           return cls;
       }
       // 加载类文件
       try{
           // 输入流读取类文件
           InputStream is = new FileInputStream(
                   path + name.replace(".","/")+".class");
           // 然后转化为byte数组
           byte[] bytes = IOUtils.toByteArray(is);
           return defineClass(name,bytes,0,bytes.length);
       }catch (IOException e){
           e.printStackTrace();
       }
       return super.loadClass(name);
    }
}
  1. 开始读取类
public static void main(String[] args) {
        try {
            MyClassLoader mcl = new MyClassLoader();
            Class<?> cls = mcl.findClass("com.test.MyClassLoaderTest");
            System.out.println(cls.getClassLoader());
            Field field = FieldUtils.getField(cls,"value",true);
            Object value = field.get(cls.newInstance());
            System.out.println(value);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
  1. 输出
    自定义类加载器正常加载到类,程序最后输出:
testtesttest
  1. URLClassLoader
    上面这自定义的类加载器可以用来读取自定义的目录,直接舒勇URLClassLoader就能读取,它已经实现了路径下类的读取逻辑。
 public static void main(String[] args) {
        try {
            URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:///E:\\test\\")});
            Class<?> cls = ucl.loadClass("com.test.MyClassLoaderTest");
            System.out.println(cls.getClassLoader());
            Field field = FieldUtils.getField(cls,"value",true);
            Object value = field.get(cls.newInstance());
            System.out.println(value);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

相关文章

  • 自定义类加载器

    自定义类加载器的实现

  • 自定义类加载器

    一. 自定义一个类加载器 基本思路: 实现自定义的类加载器需要继承抽象类ClassLoader,并重写findCl...

  • 实现一个自定义类加载器

    实现一个自定义类加载器,加载自定义目录下的类。 要读取的自定义目录的类 自定义ClassLoader 开始读取类 ...

  • 笔记 classloader

    ClassLoader抽象类,主要实现:系统类加载器和自定义加载器。 ClassLoader https://ww...

  • java 类加载器

    自定义类加载器 自定义类加载器运行

  • 2021-06-14_Java自定义类加载器2

    20210614_Java自定义类加载器2 1概述 我们知道自定义类加载器就是用于对象隔离,如何实现呢? 本章主要...

  • 近期面试java基础部分面试题

    java部分: 常见的加载器有哪些,如何自定义一个加载器? 类加载器:启动类加载器(bootstrap class...

  • 类加载阅读目录

    什么是类加载器 类加载器与类的”相同“判断 类加载器种类 双亲委派模型 类加载过程 自定义类加载器 JAVA热部署...

  • JVM(四)-类加载器

    类加载器大的分类分为两类(JAVA虚拟机规范):引导类加载器、自定义类加载器 引导类加载器(启动类加载器) Boo...

  • 05_JVM学习笔记_类加载器重要方法详解

    类加载器重要方法 实现自定义类加载器,需要继承ClassLoader并重写findClass方法并会用到Class...

网友评论

      本文标题:实现一个自定义类加载器

      本文链接:https://www.haomeiwen.com/subject/dhgwwrtx.html