java类加载的双亲委派机制

双亲加载机制

1. 三个加载器

Bootstrapclassloader启动类加载器存在于java虚拟机的内核中,它由C++代码实现所以没有java的字节码,虚拟机启动的时候就会启动该加载器,它负责它负责将 /lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

Extensionclassloader标准扩展类加载器负责搜寻JRE所在目录的lib/ext 目录下的classes或.jar中是否有指定的类别并加载(实际上是由系统参数java.ext.dirs指定);

AppClassLoader则搜寻 Classpath中是否有指定的classes并加载(由系统参数java.class.path指定)

appclassloader的parent是extensionclassloader,而extensionclassloader的parent是bootstrapclassloader

2. 双亲委派机制

某个特定类加载器在接到加载类的请求时,就会逐级向上递归查找parent类加载器是否加载过这个类,如果找到顶都没有加载过才是尝试亲自加载该类,如果自己也找不到加载资源就抛出NoClassDefFoundError,每个Class的实例都会记得是哪个ClassLoader加载它的,可以由Class的getClassLoader()取得加载该类别的ClassLoade

3. 双亲加载机制的意义

避免同一个类被重复加载,我们可以利用这个类加载机制来实现一个自定义的类加载器来加载诸如自定义的java.lang.System类等奇巧淫技。但是,在JVM中,判断一个对象是否是某个类型时,如果该对象的实际类型与待比较的类型的类加载器不同,那么会返回false

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容