欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android类加载ClassLoader双亲委托机制详解,

来源: 开发者 投稿于  被查看 10812 次 评论:110

Android类加载ClassLoader双亲委托机制详解,


目录
  • 一、ClassLoader类图关系
  • 二、双亲委托机制
    • 1、定义
    • 2、双亲作用

一、ClassLoader类图关系

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

二、双亲委托机制

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的详细内容,更多关于Android类加载ClassLoader的资料请关注3672js教程其它相关文章!

您可能感兴趣的文章:
  • Android源码探究之BaseDexClassLoader的使用
  • 关于Android中自定义ClassLoader耗时问题的追查
  • 浅谈Android Classloader动态加载分析
  • 详解Android类加载ClassLoader
  • Android开发中类加载器DexClassLoader的简单使用讲解

用户评论