前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一、类加载的双亲委托机制详解

一、类加载的双亲委托机制详解

作者头像
梅花
发布2020-09-28 10:50:13
7350
发布2020-09-28 10:50:13
举报

    在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余类加载器都有且只有一个父加载器

    通俗理解: 某一个类加载器加载一个特定的类,他并不是立即由自己加载了,而是将这个动作委托给父亲来完成,如果父亲还有父亲,就继续将这个动作向上传递,一直到没有父亲的 根类加载器

也就是启动类加载器。由根类加载来尝试着进行加载我们所要加载的class文件,如果不成功,就返回给拓展类加载器,拓展类加载器尝试着加载,如果不成功就继续向下传递,一直到加载成功,然后将整个加载动作返回给第一次尝试加载的加载器中。

      自己想要去加载,自己不去加载,让自己的父亲去加载,如果上面还有,就继续向上追溯,一直到根节点,然后根节点尝试自己加载,如果能加载,则成功,传递加载动作给 第一次加载的类加载器,如果不成功,传递给子节点,让子节点尝试去加载,子节点能否加载成功,成功则返回加载动作,如果不成功,接续传递给子节点,重复执行。

    并不是所有的类加载都是双亲委托机制 Oracle 的JDK 是标准的双亲委托机制

二、使用代码进行测试、分别加载String 和用户自定义的类

代码语言:javascript
复制
package com.zuoyan.classloader;

public class ClassLoaderDemo {
    
    public static void main(String[] args) throws Exception {
        Class<?> clazz1 = Class.forName("java.lang.String");
        ClassLoader clazz1ClassLoader = clazz1.getClassLoader();
        Class<?> clazz2 = Class.forName("com.zuoyan.classloader.C");
        ClassLoader classLoader2 = clazz2.getClassLoader();

        System.out.println(clazz1ClassLoader);
        System.out.println(classLoader2);

    }
}

class C{

}

  代码执行结果:

    null     sun.misc.Launcher$AppClassLoader@18b4aac2

  执行结果的解释,如果是使用跟类加载进行加载的,返回的就是null ,以下是类加载中的getClassLoader 上的方法注释

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、使用代码进行测试、分别加载String 和用户自定义的类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档