看下面的例子:
package com.zzj.classloader;
import java.io.IOException;
import java.io.InputStream;
/**
* 类型相等判断
*
* @author Administrator
*
*/
public class ClassEqualTest {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = new ClassLoader() {
@Override
public Class> loadClass(String name)
throws ClassNotFoundException {
InputStream in = getClass().getResourceAsStream(
name.substring(name.lastIndexOf(".") + 1) + ".class");
if (in == null) {
return getClass().getClassLoader().loadClass(name);
}
byte[] b = null;
try {
b = new byte[in.available()];
in.read(b);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return defineClass(name, b, 0, b.length);
}
};
ClassEqualTest classEqualTest = (ClassEqualTest) classLoader.loadClass(
"com.zzj.classloader.ClassEqualTest").newInstance();
System.out.println(classEqualTest);
}
}输出:
Exception in thread "main" java.lang.ClassCastException: com.zzj.classloader.ClassEqualTest cannot be cast to com.zzj.classloader.ClassEqualTest
at com.zzj.classloader.ClassEqualTest.main(ClassEqualTest.java:29)
我们可以看到,两个相同的类型居然不能转换,原因就在于他们不是由同一个类加载器加载的。
所以两个对象的类型要相等,不但要求他们的类型相同,还有求他们类型的类加载器是同一个。