内容:对于任意的一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类空间。只要加载类的类加载器不同的话,那么这个两个类就必定不相等(包括equals()方法,instanceof()方法)。此时,虚拟机中存在两个ClassLoaderTest,一个是由系统应用程序类加载器加载的,另一个是由我们定义的类加载器加载的。一个简单的例子说明:注意getResourceAsStream的应用:Class.getResourceAsStream(String path):path 不以"/"开头时默认是从此类所在的包下取资源,以"/"开头则是从ClassPath根下获取,也就是bin开始。
public class ClassLoaderTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
ClassLoader myLoader = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try {
String className = name.substring(name.lastIndexOf(".") + 1) + ".class";
//返回读取指定资源的输入流
InputStream is = getClass().getResourceAsStream(className);
if (is == null) return super.loadClass(name);
byte[] b = new byte[is.available()];
is.read(b);
//将一个byte数组转换为Class类的实例
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
throw new ClassNotFoundException(name);
}
}
};
Object object = myLoader.loadClass("test.ClassLoaderTest").newInstance();
System.out.println(object.getClass());
System.out.println(object instanceof test.ClassLoaderTest);
}
}原文:http://blog.csdn.net/u011345136/article/details/45823423