实现一个自定义类加载器

2022-08-18  本文已影响0人  糯米团子123

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

  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();
        }
    }
上一篇下一篇

猜你喜欢

热点阅读