背景:比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,因为对于任意一个类都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性。
//customer myloader,可以加载与自己在同一路径下的class文件
ClassLoader myloader = new ClassLoader(){
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
String filename = name.substring(name.lastIndexOf(".")+1)+ ".class" ;
InputStream in = getClass().getResourceAsStream(filename);
if(in == null){
return super.loadClass(name);
}
try {
byte[] b = new byte[in.available()];
in.read(b);
return defineClass(name,b,0,b.length);
} catch (IOException e) {
throw new ClassNotFoundException(name);
}
}
};
Object obj = myloader.loadClass("com.agileboot.domain.god.ClassLoadTest").newInstance();
System.out.println(obj.getClass());
// false 一个是虚拟机的应用程序类加载器加载,obj为自定义类加载器加载,虽然是来之同一个class文件,但是Java虚拟机中仍然两个独立的类。
System.out.println(obj instanceof com.agileboot.domain.god.ClassLoadTest);
output:
class com.agileboot.domain.god.ClassLoadTest
false