关于Class Loader的一点释疑

1, 自定义的ClassLoader是被动的,如果不主动调用,默认激活的Classloader是SUN的AppClassLoader.JDK ClassLoader 定义了parent delegate的方式,自定义的ClassLoader是可以无视这个规则的。

2, 通过主动调用loadClass(name, resolve),则自定义的ClassLoader被激活,在链接Class中对其它的类引用,仍会使用自定义的ClassLoader加载。AppClassLoader默认被激活的,就是因为Main方法所在的类就是用它加载的。

3, ClassLoader要不要实现缓存机制?加载的Class会被存放在方法区上,当链接类时,如果在方法区没有找到,然后才调用ClassLoader,JDK的ClassLoader使用了Hash做缓存,有一个问题还没有想明白,如果自定义方式加载的类要垃圾回收,怎么释放缓存? 个人感觉缓存只是为了避免重复主动加载的出错。

一个优先使用自定义ClassLoader的简单实现.
package test;

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

/**
 * @author Brodie Chi
 */
public class MyClassLoader extends ClassLoader{

	@Override
	protected synchronized Class<?> loadClass(String name, boolean resolve)
	throws ClassNotFoundException {
		try{
			byte[] data = loadClassData(name);
			return defineClass(name, data, 0, data.length);
		}catch(Exception e){
			return super.loadClass(name, resolve);
		}
	}


	private byte[] loadClassData(String name) throws Exception{
		int BUFFER_SIZE = 1024;
		FileInputStream in = null;
		name = name.replaceAll("\\.", "/");
		in = new FileInputStream(new File("E:\\workspace\\example\\bin\\" + name + ".class"));
		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[BUFFER_SIZE];
		int count = in.read(buffer);
		while(count == BUFFER_SIZE){
			byteStream.write(buffer);
			count = in.read(buffer);
		}
		byteStream.write(buffer, 0, count);
		return byteStream.toByteArray();
	}
}

你可能感兴趣的:(jdk,sun)