美文网首页
ClassLoader详解

ClassLoader详解

作者: myserendipit | 来源:发表于2018-05-07 10:44 被阅读15次

ClassLoader详解

ClassLoader种类

  • BootClassLoader :加载系统Framework层级需要的类
  • PathClassLoader:应用启动时创建,用于加载.apk里的类
  • DexClassLoader
  • BaseDexClassLoader

运行一个APP至少有两个Classloader

双亲代理模式

创建一个classloader示例,需要一个classloader作为其parent,所以整个Android系统的classloader就是一课树。

初始化一个classloader,以下来自Android API27源码ClassLoader.java

    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        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;
    }

通过给定指定的name加载class

  1. 检查是否已经被加载过
  2. 检查父类class loader是否已经加载了,如果父类是空的,则用虚拟机代替
  3. 调用findClass(String)方法找到class

这样的检测是可以保证一些Framework层级的类一旦被顶层的ClassLoader加载过就会缓存在内容中,以后任何地方使用都不需要重新加载。

这样做还可以防止用户自定义的类型冒充了核心代码而造成安全问题。

是同一个类的条件:

  1. 相同class name
  2. 相同package name
  3. 相同的class loader加载

相关文章

网友评论

      本文标题:ClassLoader详解

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