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

实现一个自定义类加载器

作者: 糯米团子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();
            }
        }
    

    相关文章

      网友评论

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

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