一、定义类,继承ClassLoader
package cn.edu.tju.test;
import java.io.*;
public class MyClassLoader extends ClassLoader{
private final String fileExtension=".class";
private String path="";
private String classLoaderName;
public MyClassLoader(){
super();
}
public MyClassLoader(String path){
super();
this.path = path;
}
public MyClassLoader(String path, ClassLoader parent){
super(parent);
this.path=path;
}
@Override
protected Class<?> findClass(String className) {
byte[] data = this.loadClassData(className);
System.out.println("find class called......");
return this.defineClass(className, data, 0, data.length);
}
private byte[] loadClassData(String className) {
InputStream inputStream = null;
byte[] data = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
className = className.replace('.', '\\');
inputStream = new FileInputStream(new File( path +className + fileExtension));
byteArrayOutputStream = new ByteArrayOutputStream();
int ch = 0;
while (-1 != (ch = inputStream.read())) {
byteArrayOutputStream.write(ch);
}
data = byteArrayOutputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
}
二、创建自定义类加载器的实例,并加载类:
package cn.edu.tju.test;
public class ClassLoaderTest4 {
public static void main(String[] args) throws Exception {
MyClassLoader myGoodClassLoader = new MyClassLoader("d:\\");
Class<?> clazz = myGoodClassLoader.loadClass("cn.edu.tju.domain.E");
System.out.println(clazz);
Object object =clazz.newInstance();
System.out.println(object);
System.out.println(clazz.getClassLoader());
}
}
其中E.class这个文件是位于D:\cn\edu\tju\domain这个目录的一个类文件。
loadClass时,首先会委托其父加载器AppClassLoader进行加载,
AppClassLoader委托ExtClassLoader进行加载,
ExtClassLoader委托Bootstrap ClassLoader进行加载,加载失败,返回ExtClassLoader进行加载,
ExtClassLoader加载失败,返回AppClassLoader进行加载,如果类路径下没有E.class这个文件,加载失败,返回MyClassLoader进行加载,
如果加载成功,则继续执行,否则抛出类加载失败异常