Java类加载器

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

public class MyClassLoader extends ClassLoader{
	
	private String basepath;
	private List names;
	
	public MyClassLoader(String basepath) {
		this.basepath=basepath; 
		this.names=Arrays.asList(new File(basepath).list());	
	}
	
	/* (non-Javadoc)
	 * @see java.lang.ClassLoader#loadClass(java.lang.String) 
	 * 通过重写此方法来实现自定义的类加载,打破了双亲委派模型
	 */
	@Override
	public Class<?> loadClass(String name) throws ClassNotFoundException{
		// 如果跑加载的类名在当前自定义的文件夹下,则由此自定义的类加载器进行加载
		if(names.contains(name+".class")){
			return findClass(name);
		// 否则,交给应用系统类加载器走双亲委派模型进行加载
		}else{
			return MyClassLoader.getSystemClassLoader().loadClass(name);
		}
	}
	
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] classData=getClassData(name);
		if(classData==null){
			throw new ClassNotFoundException();
		}else{
			return defineClass(name, classData, 0, classData.length);
		}

	}
	private byte[] getClassData(String name){
		ByteArrayOutputStream out=new ByteArrayOutputStream();
		try{
			InputStream in=new FileInputStream(this.basepath+name+".class");
			byte[] buffer=new byte[2048];
			int num=0;
			while((num=in.read(buffer))!=-1){
				out.write(buffer, 0, num);
			}
			in.close();
			byte[] classData=out.toByteArray();
			out.close();
			return classData;
		}catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值