This is an example using classloader and you can see the output. Why are obj
's and obj2
's classloaders different? I know about the 'delegate to parent classloader' idea.
public class jvm_77{
public static void main(String[] args) throws Exception{
ClassLoader myLoader = new ClassLoader(){
public Class<?> loadClass(String name) throws ClassNotFoundException{
try
{
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
InputStream is = getClass().getResourceAsStream(fileName);
if(is == null)
{
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name,b,0,b.length);
}catch(IOException e)
{
throw new ClassNotFoundException(name);
}
}
};
Object obj = myLoader.loadClass("Chapter7_ClassLoader.jvm_77").newInstance();
jvm_77 obj2 = new jvm_77();
System.out.println(obj.getClass().getClassLoader()); //Chapter7_ClassLoader.jvm_77$1@1888759
System.out.println(obj2.getClass().getClassLoader()); //sun.misc.Launcher$AppClassLoader@45a877
System.out.println(obj.equals(obj2));//false
System.out.println(obj instanceof Chapter7_ClassLoader.jvm_77);//false
System.out.println(obj2 instanceof Chapter7_ClassLoader.jvm_77);//true
}
}