我使用了自定义类加载器的两个实例来加载类,但是它们的hashCode不相等。
public class MyClassLoader extends ClassLoader{
private String mLibPath;
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader classLoader1 = new MyClassLoader("/Users/kk/Downloads");
MyClassLoader classLoader2 = new MyClassLoader("/Users/kk/Downloads");
Class<?> c1 = classLoader1.loadClass("loader.DemoObj");
Class<?> c2 = classLoader2.loadClass("loader.DemoObj");
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
}
public MyClassLoader(String path){
mLibPath = path;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String fileName = getFileName(name);
File file = new File(mLibPath,fileName);
try {
FileInputStream is = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len=0;
try{
while((len = is.read()) != -1){
bos.write(len);
}
}catch (IOException e){
e.printStackTrace();
}
byte[] data = bos.toByteArray();
is.close();
bos.close();
return defineClass(name, data, 0, data.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.findClass(name);
}
private String getFileName(String name){
name = name.replace(".","/");
return name+".class";
}
}
classLoader1和classLoader2都调用loadClass(“ loader.DemoObj”),它们应该调用findLoadedClass()来检查缓存是否具有loader.DemoObj的类。上面的代码应该返回两个相同的数字,但我的代码返回不同的数字。
1846274136
1639705018