import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* 自定义类加载器
*
* @author sunhf
*
*/
public class CustomCL extends ClassLoader {
private String path;
private Set<String> clazzs;
public CustomCL(String path, String[] clazzs) {
super(null); // 不使用父类实现
this.clazzs = new HashSet<String>(Arrays.asList(clazzs));
this.path = path;
onBoot(clazzs);
}
private void onBoot(String[] clazzs) {
for (String name : clazzs) {
defClass(name);
}
}
private Class<?> defClass(String name) {
String diskUrl = path + name.replace('.', File.separatorChar) + ".class";
Class<?> clazz = null;
try {
File clazzF = new File(diskUrl);
FileInputStream stream = new FileInputStream(clazzF);
int len = (int) clazzF.length();
byte[] b = new byte[len];
stream.read(b);
stream.close();
int off = 0;
clazz = defineClass(name, b, off, b.length);
} catch (IOException e) {
e.printStackTrace();
}
return clazz;
}
/**
* 读取类
*/
@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class<?> clazz = findLoadedClass(name);
if (!this.clazzs.contains(name) && clazz == null) {
clazz = getSystemClassLoader().loadClass(name);
}
if (clazz == null) {
throw new ClassNotFoundException(name);
}
if (resolve == true) {
resolveClass(clazz);
}
return clazz;
}
/**
* 加载类
*/
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
return super.findClass(name);
}
}