ClassLoader的双亲委派机制

加载一个类是有规则的,不是一通乱加载,首先是自底向上的,先从Customer ClassLoader查找是否加载过该类,有的话直接返回就好了,如果没有,那就交给他的上级,也就是App ClassLoader去查找,以此类推,一直到最顶层的Bootstrap ClassLoader,如果都没有加载过(好家伙,新来的),这时候就开始另一种方式了,也就是图中自项向下去尝试加载,首先是Bootstrap ClassLoader(因为现在球在它这嘛,所以当然是他先了),Bootstrap ClassLoader会去rt.jar中或者是指定的jar(这个位置可以自定义哦,方式就是启动jar包的时候加上-Xbootclasspath “路径”)去查找这个类,如果找到了这个类,那就加载完返回即可,如果没有,那就交给下级,去它们自己负责的路径里面查找有没有这个类,以此类推,如果说最终都没有找到这个类,好了,别启动了,直接给老子报异常,ClassNotFoundException,老老实实去解决吧。

在这里插入图片描述
说了一大堆,可能有些小伙伴没有听懂,没有关系,接下来咱们通过一段代码来看看ClassLoader到底是怎么加载的,是不是和上图的方式一致的,看下博主到底有没有在瞎说(也不是没有可能,所以下面一段代码认真看哦):

 protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
 		//加锁
        synchronized(this.getClassLoadingLock(name)) {
        	//先让当前ClassLoader去查找,是否有加载过该类
            Class<?> c = this.findLoadedClass(name);
            //没有的话,那就进来吧你
            if (c == null) {
                long t0 = System.nanoTime();

                try {
                	//先判断是否有上级,也就是判断当前的ClassLoader是不是Bootstrap ClassLoader
                    if (this.parent != null) {
                    	//上级不为空,好办,让上级去查找
                        c = this.parent.loadClass(name, false);
                    } else {
                    	//上级为空了,说明是Bootstrap ClassLoader,那就专门调用orNull方法了
                    	//因为如果在没有找到说明就没有加载过嘛,当然就得返回null了
                        c = this.findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException var10) {
                }
				//因为上面第一种方式没有找到该类,接下来开始第二种方式了
                if (c == null) {
                    long t1 = System.nanoTime();
                    //通过自项向下的方式去尝试加载该类了
                    c = this.findClass(name);
                    PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    PerfCounter.getFindClasses().increment();
                }
            }

            if (resolve) {
                this.resolveClass(c);
            }
            
            return c;
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值