废话不多说直接上代码:
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoaderTest extends ClassLoader{
// 类加载器的名字
private String name;
// 加载类的路径
private String path;
//文件类型
private String fileType = ".class";
public String getPath() {
return path;
}
public ClassLoaderTest(String name){
super(); // 默认指定系统加载器
this.name = name;
}
public ClassLoaderTest(ClassLoader parent, String name){
super(parent); // 默认指定自己的父类加载器器
this.name = name;
}
public void setPath(String path) {
this.path = path;
}
private byte[] loadClassData(String name){
byte [] datas = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try{
String namePath = name.replace(".", "\\");
is = new FileInputStream(this.getPath()+ namePath + fileType);
baos = new ByteArrayOutputStream();
int ch = 0;
while((ch = is.read()) != -1){
baos.write(ch);
}
datas = baos.toByteArray();
}catch (Exception e) {
e.printStackTrace();
}finally{
try{
is.close();
baos.close();
}catch(IOException e1){
e1.printStackTrace();
}
}
return datas;
}
@Override
public String toString() {
return "ClassLoader' s name :" + name;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
public static void main(String[] args) throws Exception{
ClassLoaderTest c1 = new ClassLoaderTest("loader1");
c1.setPath("D:\\myapp\\Client\\");
ClassLoaderTest c2 = new ClassLoaderTest(c1,"loader2");
c2.setPath("D:\\myapp\\Server\\");
ClassLoaderTest c3 = new ClassLoaderTest(null,"loader3"); //父类加载器为根加载器(非java语言编写)
c3.setPath("D:\\myapp\\root\\");
load(c2);
load(c3);
}
private static void load(ClassLoader c) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class clazz = c.loadClass("Animal");
Object object = clazz.newInstance();
object.toString();
}
}