首页 > 其他分享 >android的双亲委派模型

android的双亲委派模型

时间:2022-10-11 22:47:14浏览次数:45  
标签:委派 name BootStrapClassLoader 双亲 android 父类 加载

java

JVM中有三个初始的类加载器:引导类加载器BootStrapClassLoader,扩展类加载器ExterntionsClassLoader,应用程序类加载器ApplicationClassLoader。

  • 引导类加载器BootStrapClassLoader是顶层类加载器,负责加载 %JAVA_HOME%/lib 目录下的jar包和类,由c++实现,并且是所有的类加载器的祖先。
  • 扩展类加载器ExterntionsClassLoader负责加载目录%JAVA_HOME%/lib/ext 目录下的jar包和类,由java实现。
  • 应用程序类加载器ApplicationClassLoader负责加载classpath下的所有jar包和类,由java实现。

java的双亲委派模型

当一个类加载器加载某一个类时会先判断当前类是否有parent父加载器,如果有就交给父类加载,父类加载器在交给父类的父类以此类推。如果父类无法加载此类在交还给子类加载器处理。
(注意下图为委派关系,并不是继承关系)

扩展类加载器ExterntionsClassLoader和应用程序类加载器ApplicationClassLoader最终都是继承与抽象类ClassLoader,查看ClassLoader的loadClass源码。

 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) {
                long t0 = System.nanoTime();
                try {
                    //父加载器不为空调用父类加载
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        //找引导类加载器加载,调用native方法
                        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.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

双亲委派模型的特点

  • 避免类的重复加载
  • 安全性,防止系统核心类被覆盖。因为所有的加载器的祖先都是引导类加载器BootStrapClassLoader,所有的系统类都是由BootStrapClassLoader加载的。如果自定义一个同包名同类名的系统类并由自定义的类加载器加载,根据双亲委派模型最终都会先由BootStrapClassLoader去加载,而BootStrapClassLoader会判断已经加载过了,所以不会重复加载。
  • 不同的类加载器加载同一个类,这两个类实际并不相等。

android

android中有几个比较重要的类加载器

  • BootClassLoader根类加载器,单例模式由JAVA实现(与java中的BootStrapClassLoader不同),同样是android中所有类加载器的祖先,负责加载系统核心类。
  • BaseDexClassLoader是PathClassLoader、DexClassLoader、InMemoryDexClassLoader的父类。
  • PathClassLoader是用来加载Android系统类和app应用类的
  • DexClassLoader可以加载任意目录下的dex/jar/apk/zip文件
  • InMemoryDexClassLoader是是API26(android 8.0)新增的类加载器,继承自BaseDexClassLoader。
    下图为各个类加载器的继承关系图(并不是委派关系图)

标签:委派,name,BootStrapClassLoader,双亲,android,父类,加载
From: https://www.cnblogs.com/revercc/p/16782904.html

相关文章

  • Android Fragment生命周期和用法解析
    Fragment生命周期图:Fragment与Activity生命周期对比图:2  生命周期分析1.当一个fragment被创建的时候,它会经历以下状态.onAttach()onCreate()onCreateView()onActivityC......
  • android开发apk安装失败对应的错误码以及原因
    android开发apk安装失败对应的错误码以及原因代码在PackageManager.java系统类里中文意思可参考:https://www.cnblogs.com/cwfsoft/p/11776094.html/***@hide 未知*......
  • 直播系统搭建,Android设置背景图延伸到状态栏
    直播系统搭建,Android设置背景图延伸到状态栏 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){      //5.0全透明实现      //......
  • Android studio安装教程
    Androidstudio安装教程傻瓜式教程如果想要彻底重装Androidstudio可以删除目录C:\Users\用户名中的以下几个文件夹。.android.gradle.Androidstudio(Androidstud......
  • Android开发 Jetpack_Compose_2 页面预览@Preview
    前言在学习jetpackcompose如何编写ui之前,我认为还是应该先了解与Androidstudio配合的页面预览@Preview。这样就可以立刻看到UI效果,从而方便后续学习验证代码。所......
  • [Android开发学iOS系列] iOS写UI的几种方式
    [Android开发学iOS系列]iOS写UI的几种方式作为一个现代化的平台,iOS的发展也经历了好几个时代.本文讲讲iOS写UI的几种主要方式和各自的特点.iOS写UI的方式在iOS中写U......
  • Android投屏工具
    苹果家族的投屏方式十分舒服,但Android投屏到WindowsPC上需借助第三方软件(大都收费,甚至不少是流氓软件)。GitHub上有一个开源项目——scrcpy,使用体验很好。1.投......
  • Android-Log工具类
    一、Log的基本格式如下为AndroidStudio抓取的一条Log:格式:datetimePID-TID/packagepriority/tag:message例子:2022-09-2119:34:15.29314923-14923/com.lzq.mycu......
  • Flutter(六):Flutter_Boost接入现有原生工程(iOS+Android)
    一、新建原生工程和FlutterModule1、新建Android工程搭建一个空的Android工程FlutterDemo_Android模拟已经存在的原有工程Android项目配置:2、新建iOS工程搭建一个空......
  • android反调试技术
    检测调试相关文件android_server等intSearchFile(){DIR*dir=opendir("/data/local/tmp");if(NULL==dir){return-1;}dirent*file=......