自定义类加载器-孙卫琴《Java面向对象编程》

package cn.edu.bnu.songjie.ch10.selfclassloader;

import java.io.*;

/**
 * 自定义的类加载器,只需要扩展ClassLoader,然后覆盖它的findClass(Sring name)方法即可,
 * 该方法根据参数指定的类名,返回对应的Class对象的引用。
 * @author songjie
 *
 */
public class MyClassLoader extends ClassLoader{
	private String name;
	private String path = "d:\\";
	private final String fileType = ".class";
	
	public MyClassLoader(String name){
		this.name = name;
	}
	
	public MyClassLoader(ClassLoader parent, String name){
		super(parent);
		this.name = name;
	}
	
	public String toString(){
		return name;
	}
	
	public void setPath(String path){
		this.path = path;
	}
	
	public String getPath(){
		return path;
	}
	
	protected Class findClass(String name){
		byte[] data = loadClassData(name);
		return defineClass(name, data, 0, data.length);//此方法从ClassLoader继承而来
	}
	/**
	 * 把类的二级制数据读入到内存
	 * @param name
	 * @return
	 */
	private byte[] loadClassData(String name){
		FileInputStream fis = null;
		byte[] data = null;
		ByteArrayOutputStream baos  = null;
		
		try{
			name = name.replaceAll("\\.", "\\\\");
			fis = new FileInputStream(new File(path+name+fileType));
			baos = new ByteArrayOutputStream();
			int ch = 0;
			while((ch = fis.read()) != -1){
				baos.write(ch);
			}
			data = baos.toByteArray();
		}catch(FileNotFoundException e1){
			System.out.println("文件没找到");
		}catch(IOException e2){
			System.out.println("文件内容读取异常");
		}finally{
			try{
				baos.close();
				fis.close();
			}catch(IOException e3){
				e3.printStackTrace();
			}			
		}
		return data;
	}
}



你可能感兴趣的:(Java,面向对象,java,classloader,string,path,class,byte)