上一節走讀了類加載器的Java doc,這一節我們實現一個自定義的類加載器:
public class MyTest16 extends ClassLoader {
private String classLoaderName;
private final String fileExtension = ".class";
public MyTest16(String classLoaderName){
/**
父類ClassLoader的構造器
protected ClassLoader() {
this(checkCreateClassLoader(), getSystemClassLoader());
}
**/
//使用系統類加載器作爲當前類的父類委託加載器
super();
this.classLoaderName = classLoaderName;
}
public MyTest16(ClassLoader classLoader,String classLoaderName){
/*
父類ClassLoader帶參數的構造器
protected ClassLoader(ClassLoader parent) {
this(checkCreateClassLoader(), parent);
}
*/
//使用自定義的類加載器作爲當前類的父類委託加載器
super(classLoader);
this.classLoaderName = classLoaderName;
}
private byte[] loadClassData(String name ){
InputStream inputStream = null;
ByteArrayOutputStream baos = null;
byte [] bytes = null;
try{
this.classLoaderName = this.classLoaderName.replace(".","/");
baos = new ByteArrayOutputStream();
int ch = 0;
while (-1 !=(ch = inputStream.read())){
baos.write(ch);
}
bytes = baos.toByteArray();
}catch (Exception e){
e.printStackTrace();
}finally {
try{
inputStream.close();
baos.close();
}catch (Exception e){
e.printStackTrace();
}
}
return bytes;
}
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
byte [] data = loadClassData(className);//中間調用子類的findClass方法
return defineClass(className,data,0,data.length);
}
public static void test(ClassLoader classLoader) throws Exception{
Class<?> clazz = classLoader.loadClass("com.twodragonlake.jvm.classloader.MyTest");
Object object = clazz.newInstance();
System.out.println(object);
}
public static void main(String[] args) throws Exception {
MyTest16 myTest16 = new MyTest16(MyTest16.class.getClassLoader(),"myClassLoader");
MyTest16.test(myTest16);
}
}
‘
輸出:
com.twodragonlake.jvm.classloader.MyTest@1540e19d