固定套路如下:
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
*/