美文网首页
Android类加载ClassLoader

Android类加载ClassLoader

作者: 载渔之洲 | 来源:发表于2022-06-29 00:53 被阅读0次

    一、ClassLoader类图关系

    ClassLoader、BootClassLoader、BaseDexClassLoader等之间关系,如下如:


    1656411840319.jpg

    二、双亲委托机制

    1、定义

    如果某个类加载器在加载类时,先不会自己去尝试加载这个类,而是首将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务或者没有父类加载器时,才会交给自己尝试加载。

    如:可以看到创建 ClassLoader 需要接收一个 ClassLoader parent 参数。这个 parent 的目的就在于实现类加载的双亲委托

    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
                // First, check if the class has already been loaded
                // 检查class是否有被加载
                Class<?> c = findLoadedClass(name);
                if (c == null) {
                    try {
                        if (parent != null) {
                            //如果parent不为null,则调用parent的loadClass进行加载
                            c = parent.loadClass(name, false);
                        } else {
                            //parent为null,则调用BootClassLoader进行加载
                            c = findBootstrapClassOrNull(name);
                        }
                    } catch (ClassNotFoundException e) {
                        // ClassNotFoundException thrown if class not found
                        // from the non-null parent class loader
                    }
    
                    if (c == null) {
                        // If still not found, then invoke findClass in order
                        // to find the class. 
                        // 如果都找不到就自己查找
                        c = findClass(name);
                    }
                }
                return c;
        }
    

    2、双亲作用

    1)、避免重复加载,当父加载器已经加载了该类的时候,就没有必要子ClassLoader再加载一次。

    2)、安全性考虑,防止核心API库被随意篡改。

    相关文章

      网友评论

          本文标题:Android类加载ClassLoader

          本文链接:https://www.haomeiwen.com/subject/fiftbrtx.html