天天看点

自定义ClassLoader及其使用

MyClassLoader.java

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;


public class MyClassLoader extends ClassLoader {
	private String name;
	private String path = "d:/";
	private String fileType = ".class";
	public String getPath() {
		return path;
	}
	
	public void setPath(String path) {
		this.path = path;
	}
	
	public MyClassLoader(String name){
		super();
		this.name = name;
	}
	
	public MyClassLoader(ClassLoader parent,String name){
		super(parent);
		this.name = name;
	}
	
	@SuppressWarnings("deprecation")
	@Override
	public Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] data = classToByteArray(name);
		return data!=null ? defineClass(data, 0, data.length):null;
	}
	
	public byte[] classToByteArray(String name){
		name = name.replace(".", "/");
		File file = new File(path+name+fileType);
		if(!file.exists())return null;
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		byte[] data = null;
		try{
			is = new FileInputStream(file);
			baos = new ByteArrayOutputStream();
			int a =0;
			while(-1 != (a = is.read())){
				baos.write(a);
			}
			data = baos.toByteArray();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				baos.close();
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return data;
	}
	
	public static void main(String[] args)throws Exception {
		MyClassLoader loader1 = new MyClassLoader("loader1");
		loader1.setPath("d:/loader/loader1/");
		MyClassLoader loader2 = new MyClassLoader(loader1,"loader2");
		loader2.setPath("d:/loader/loader2/");
		MyClassLoader loader3 = new MyClassLoader(null,"loader3");
		loader3.setPath("d:/loader/loader3/");
		Class clazz = loader2.loadClass("Person");
		Class clazz1 = loader3.loadClass("Person");
		clazz.newInstance();
		clazz1.newInstance();
	}
	
	@Override
	public String toString() {
		return this.name;
	}
}
      

Person.java

public class Person {
	public Person(){
		System.out.println("Person class is init by : " +this.getClass().getClassLoader());
		new Dog();
	}
}
      

Dog.java

public class Dog {
	public Dog(){
		System.out.println("Dog class is init by : " +this.getClass().getClassLoader());
	}
}