实现一个自定义类加载器
2022-08-18 本文已影响0人
糯米团子123
实现一个自定义类加载器,加载自定义目录下的类。
- 要读取的自定义目录的类
package com.test
public class MyClassLoaderTest {
private String value = "测试自定义类加载器的自定义类";
}
- 自定义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);
}
}
- 开始读取类
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();
}
}
- 输出
自定义类加载器正常加载到类,程序最后输出:
testtesttest
- 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();
}
}