自定义ClassLoader

废话不多说直接上代码:

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();
	}
	
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值