类加载器双亲委派

先说结论

AppClassLoad 调用loadClass(String name), 判断是否有父加载器,
如果有就调用父类的loadClass(String name),父类继续判断是否有爷爷加载器,
如果有就调用爷爷类的loadClass(String name),如果爷爷类没有太爷加载器,就去调用BootStrapClassLoad,使用native方法,加载jre库;如果没有找到返回null;
此时调用子类的fildClass(String name)方法,委托给子类去查找;

其中 fildClass(String name) 方法比较重要,是抽象方法,你如果不实现,向下委派的时候就ClassNotFoundException,你可以实现 去任何地方加载类,去本地,去任意文件夹,去任意网络,只要你想得到;

总结流程如图:

在这里插入图片描述

源码如下:已删除 多余代码,简洁处理了

protected Class<?> loadClass(String name, boolean resolve) {
        synchronized (getClassLoadingLock(name)) {
            // 第一步检查类是否被加载过
            Class<?> c = findLoadedClass(name);
            // 没有被加载过
            if (c == null) {
                try {
                // 如果存在父加载器,向上委派,使用父加载器加载
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                    // 没有了父加载器,使用BootstrapClassLoad, c++代码所写
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                }
                // 如果都没加载到,
                if (c == null) {
					// 调用子类的findClass,向下委派,子类主要是重写此方法进行任意加载
                    c = findClass(name);
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

能力有限、不足之处望评论指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值