固定套路如下:
1. extends classloader 或者其他classloader实现
2. 重写如下父类方法:
Class findClass(String name)
3. 在步骤2中,读取.class的二进制文件数据,然后调用父类中的defineClass方法还原出Class对象。
实战实例:
public class SepClassLoader extends ClassLoader {
/**
* 需要该类加载器直接加载的类文件的基目录
*/
private String baseDir;
/**
* 需要由该类加载器直接加载的类名
*/
private HashSet classSet;
/**
* 带参构造
* @param baseDir
* @param classes
* @throws IOException
*/
public SepClassLoader(String baseDir, String[] classes) throws IOException {
//TODO 存疑,实际上我这里改成super()也能很好的运行
super(null);
this.baseDir = baseDir;
this.classSet = new HashSet();
for (int i = 0; i < classes.length; i++) {
findClass(classes[i]);
classSet.add(classes[i]);
}
}
/**
* 重写findclass方法
* <p>
* 在ClassLoader中,loadClass方法先从缓存中找,缓存中没有,会代理给父类查找,如果父类中也找不到,就会调用此用户实现的findClass方法
*
* @param name
* @return
*/