您的位置:首页 > 其它

实现自己的类加载器(简单类加载器)

2011-03-21 22:23 211 查看
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 {
	

	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 className) {
		String path = classNameToPath(className);
		try {
			InputStream ins = new FileInputStream(path);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int bufferSize = 4096;
			byte[] buffer = new byte[bufferSize];
			int bytesNumRead = 0;
			while ((bytesNumRead = ins.read(buffer)) != -1) {
				baos.write(buffer, 0, bytesNumRead);
			}
			return baos.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	private String classNameToPath(String className) {
		return MyClassLoader.class.getResource("/").getFile() + File.separatorChar
				+ className.replace('.', File.separatorChar) + ".class";
	}

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		MyClassLoader myclassLoader = new MyClassLoader();
		

		Class s = myclassLoader.findClass("com.whs.tttt");
		Class s2 = myclassLoader.loadClass("com.whs.tttt");
		
		
		System.out.println(s.getClassLoader());
		System.out.println(s2.getClassLoader());
		

	}
}


打印结果完全不一样,loadclass方法会发现,其实本事classpath下的东西,myclassloader是不会去加载的,会委托父类加载。

findclass会自己去加载,所以如果把s cast 为com.whs.tttt就会出错,但是s2是不会的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: