转自:http://blog.csdn.net/xyang81/article/details/7292380(该文章举例说明了不同类加载器加载同一份class仍然不能类型互转)
转自:http://www.cnblogs.com/xujian2014/p/5551153.html
详细JVM介绍:http://blog.csdn.net/zhoudaxia/article/details/35824249
核心的加载图,理解查找顺序和加载顺序
自底向上查找直至Bootstrap ClassLoader,如果找不到则从顶向下开始加载,这样子保证如果由父类已经加载了,你们就不用重复加载了,如果父类没有加载,优先由父类进行加载。
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println("系统类装载器:"+ systemClassLoader);
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println("系统类装载器的父类加载器——扩展类加载器:"+ extClassLoader);
ClassLoader bootClassLoader = extClassLoader.getParent();
System.out.println("扩展类加载器的父类加载器——引导类加载器:"+ bootClassLoader);
观察ClassLoader类的构造方法可以发现,可以显式指定父类加载器,也可以使用默认的形式。
有些文章或资料上写到“默认的父类加载器为系统类加载器”,“默认的父类加载器为引导类加载器”,这里我又觉得含糊不清了,为什么?
这里可以有两种理解:一、使用ClassLoader() 不带参数的构造方法时其父类加载器是什么。
二、使用ClassLoader(ClassLoader parent)这种传入null作为参数的构造方法时其父类加载器是什么。这两种“默认情况”是不一样的。
当使用ClassLoader(ClassLoader parent)传入null的时候,其父类加载器是引导类加载器(当然,也可以将null理解成引导类加载器);
当使用没有参数的ClassLoader()时,其父类加载器一般为系统类装载器,这个构造方法等价于ClassLoader(ClassLoader.getSystemClassLoader())。