深入分析Java ClassLoader原理(转载)

转自: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())。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容