最常规的equals()方法我就不过多的解释了。这两天我学习了classloader,对其有了一定的了解,其中有一个命名空间的概念:每个classloader实例维持了一个独有的名称空间。于是我就想了解:不同的classloader所加载的类并非是同一个类,话不多说,具体见代码:
输出显示:不同classloader加载的class根本就不同。所以equals方法也不可能通过。从jvm的角度而言,这两个同一个包、同名的类也是不同的。
package com.cxz.classloader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class Tester {
public static void main(String[] args) throws MalformedURLException,
InstantiationException, IllegalAccessException,
ClassNotFoundException {
URL url = null;
url = new URL("file:///E:\\classes\\");
URL[] urls = new URL[1];
urls[0] = url;
URLClassLoader urlClsLdr1 = new URLClassLoader(urls);
Compare compare1 = (Compare) urlClsLdr1.loadClass(
"com.cxz.classloader.Sample").newInstance();
Compare compare3 = (Compare) urlClsLdr1.loadClass(
"com.cxz.classloader.Sample").newInstance();
URLClassLoader urlClsLdr2 = new URLClassLoader(urls);
Compare compare2 = null;
compare2 = (Compare) urlClsLdr2.loadClass("com.cxz.classloader.Sample")
.newInstance();
System.out.println(compare1.getClass().equals(compare2.getClass()));
}
}
输出显示:不同classloader加载的class根本就不同。所以equals方法也不可能通过。从jvm的角度而言,这两个同一个包、同名的类也是不同的。