自定义类加载器
问问自己,什么时候需要自定义类加载器
- 1)想加载非classpath随意路径中的类文件
- 2)都是通过接口来使用实现,希望解耦时,常用在框架设计
- 3)这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于tomcat容器
步骤:
- 继承classloader父类
- 要遵从双亲委派机制,重写findClass方法
- 注意不是重写loadClass方法,否则不会走双亲委派机制(这里其实重写findClass就行,这样就能够找到自己想加载的类)
- 读取类文件的字节码
- 调用父类的defineClass方法来加载类(使用也挺方便的)
- 使用者调用该类加载器的loadClass方法
简单示例:
public class MyClassLoader extends ClassLoader{
@Override //name 表示类名字
protected Class<?> findClass(String name) throws ClassNotFoundException {
String path = "d:\\myclasspath\\" + name + ".class";
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Files.copy(Paths.get(path), bos);
byte[] bytes = bos.toByteArray();
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
throw new ClassNotFoundException();
}
}
}