双亲委派机制笔记

1,什么是双亲委派机制?

我的理解是,在java中,当类加载器需要对class文件进行加载时,会递归调用父加载器,当父加载器加载失败时,再向下递归传递进行加载,最后加载成功或失败。(感觉有点绕~)

2,类加载器有哪些?

在这里插入图片描述

3,执行流程是怎样的?

在这里插入图片描述

4,优点

1,安全加载:当加载类时,先委托父加载器加载可以避免破坏我们核心包里面的类。如我们可以项目里面建一个java.lang.String的类,但这样运行时实际找到的是Bootstrap ClassLoad加载的核心包里面的String,从而起到保护作用。

2,避免类重复加载:当父加载器已经加载了某类时,子加载器就没必要再加载一次。

5,打破双亲委派

创建一个类继承ClassLoader,重写loadClass()方法。
但重写的时候需要注意,核心类文件还是需要向上传递进行加载(loadClass),只有需要自定义加载器加载的目录才直接加载(findClass);否则会出现Object类找不到异常

 protected Class<?> loadClass(String name, boolean resolve)  throws ClassNotFoundException {
         synchronized (getClassLoadingLock(name)) {
             // First, check if the class has already been loaded
             Class<?> c = findLoadedClass(name);
             if (c == null) {
                 // If still not found, then invoke findClass in order
                 // to find the class.
                 long t1 = System.nanoTime();
                 
                 //*********** 判断如果为当前需要当前加载器直接加载的目录,则不再向上传递
                if(name.startsWith("com.test")){
                     c = findClass(name);
                 }else{
                     //否则按照向上加载,避免出现Object类未找到异常
                     c = this.getParent().loadClass(name);
                 } 
                 //*************
                 
                 // this is the defining class loader; record the stats
                 sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                 sun.misc.PerfCounter.getFindClasses().increment();
             }
             if (resolve) {
                  resolveClass(c);
             }
             return c;
         }
    }
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        MyClassLoader myClassLoader = new MyClassLoader("D:/test");
        Class clazz = myClassLoader.loadClass("com.test.User");
        Object obj = clazz.newInstance();
        Method method = clazz.getDeclaredMethod("study");
        method.invoke(obj,null);
        System.out.println(clazz.getClassLoader().getClass().getName());

    }

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值