loadClass基本流程

/*** Loads the class with the specified <a href="#name">binary name</a>.  The*/
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{// First, check if the class has already been loadedClass<?> 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;
}
复制代码

可以看出loadClass的基本流程如下:

首先判断是否已经加载过class,如果加载过,就直接返回对应的Class<?>对象;如果没有加载过,就查找它的父类是否加载过,如果父类加载过,就返回;如果父类未加载过,就自己去加载。

Android应用中ClassLoader对象

public class MainActivity extends AppCompatActivity {private static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);printClassLoaders();setContentView(R.layout.activity_main);}private void printClassLoaders() {ClassLoader classLoader = getClassLoader();if (classLoader != null) {Log.e(TAG, "Current ClassLoader is: " + classLoader.toString());while (classLoader.getParent() != null) {classLoader = classLoader.getParent();Log.e(TAG, "ClassLoader's parent is: " + classLoader.toString());}}}
}
复制代码

我们创建一个Android项目,在Activity的onCreate方法中打印ClassLoader的值,如上。

打印结果如下:

2019-04-30 18:52:53.219 16456-16456/com.my.classloaderdemo E/MainActivity: Current ClassLoader is: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/base.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_dependencies_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_resources_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_0_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_1_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_2_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_3_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_4_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_5_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_6_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_7_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_8_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/lib/x86, /system/lib, /vendor/lib]  ]
]2019-04-30 18:52:53.219 16456-16456/com.my.classloaderdemo E/MainActivity: ClassLoader's parent is: java.lang.BootClassLoader@c8bb22f
复制代码

由打印日志可以看出,此App包含了两种ClassLoader,一个是PathClassLoader,一个是BootClassLoader。

BootClassLoader是系统启动时创建的,用于加载Android FrameWork层的class;PathClassLoader是在App启动时创建的,用于加载该App中的class文件。

ClassLoader的作用

1,共享作用:类加载过,后面用到时就不用再加载。

2,隔离作用:不同继承路线的类加载器,加载的类一定是不同的。

DexClassLoader与PathClassLoader异同点

DexClassLoader和PathClassLoader都是继承BaseDexClassLoader。

DexClassLoader:可加载jar/dex/apk,也可以加载SD卡中未安装的apk。

PathClassLoader:只可加载系统中已经安装的apk。

转载于:https://juejin.im/post/5cd27a51f265da036c57a096

Android的ClassLoader知多少相关推荐

  1. Android 开发者必知的开发资源

    英文原文:Bongzimo  翻译: ImportNew-黄小非 译文链接:http://www.importnew.com/3988.html Android 开发者必知的开发资源 随着Androi ...

  2. android classloader异常,Android中ClassLoader类加载机制

    Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...

  3. Android HTTP必知必会

    HTTP协议使用如此广泛,开发者务必要做到"知","会". 引子 用curl请求百度首页全解析的过程: 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  4. android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...

    一.Java中的ClassLoader是什么? 当写好一个Java应用程序,程序都是由若干个.class类文件组织而成的,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都 ...

  5. 高仿知乎android客户端,仿知乎分享界面

    前言 最近在做一个资讯类的APP,上面需要一个分享功能,项目不大,如果去使用官方的SDK还需要审查之类的,感觉太麻烦.偶然看到知乎的分享界面做得不错,拿到我这个项目中正合适,在网上查了一下资料,使用B ...

  6. 高仿知乎android,Android高仿知乎首页Behavior

    Android自定义Behavior实现跟随手势滑动,显示隐藏标题栏.底部导航栏及悬浮按钮 Android Design包下的CoordinatorLayout是相当重要的一个控件,它让许多动画的实现 ...

  7. android app报告,知乎APP用户体验报告

    一.设备信息 App版本:3.3.0 更新时间:2016年4月26日 手机信息:魅族MX5 Android版本:5.1 系统版本:Flyme OS 5.6.4.19beta 二.产品概述 知乎属于通讯 ...

  8. android ui设计 知乎,界面设计进化!知乎日报2.0新版发布下载

    [PConline 资讯]"知乎"这个大名几年来在网上可谓风生水起,知乎网的网友来自各行各业,通过知乎这个知识问答社区,往往能够提供一些令人大开眼界的内容.而"知乎日报& ...

  9. 那些android你需要知道的事

    转载 :https://www.uisdc.com/material-design-knowledge 为您准备了最新的 Material Design设计规范,请伴随笔记一口吃掉. 一.安卓是什么? ...

最新文章

  1. Win7如何改变用户文件夹位置
  2. Rocketmq原理最佳实践
  3. [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由
  4. 工作116:确定需求报告
  5. mysql 主键倒序查询速度慢_一亿条数据order by主键降序速度很慢
  6. LockSupport HotSpot里park/unpark的实现
  7. 【Hadoop Summit Tokyo 2016】欢迎来到Hadoop的青春时代
  8. 001 - CMake 安装
  9. Macbook pro 2015 13寸丐版更换512G固态流程记录
  10. dell 恢复介质_戴尔官方WIN10恢复介质镜像下载与安装教程 | Dell 中国
  11. idea社区版创建springboot_idea社区版+spring boot
  12. ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
  13. NOIP 模拟题 国际跳棋
  14. matlab 还原内部函数,matlab内部函数
  15. python计算身份证最后一位数字代表什么_一个计算身份证号码校验位的Python小程序...
  16. CF1428 G1,G2 . Lucky Numbers题解
  17. [Games 101] Lecture 13-16 Ray Tracing
  18. 百钱百鸡问题(C++枚举法)
  19. Kibana:Kibana 入门 (二)
  20. 温暖别人就是温暖自己

热门文章

  1. boost::mp11::mp_fill相关用法的测试程序
  2. 宏BOOST_CHECK_EXCEPTION用法的测试程序
  3. boost::geometry::enrich_intersection_points用法的测试程序
  4. GDCM:gdcm::VM的测试程序
  5. VTK:Texture之TexturedSphere
  6. VTK:简单操作之DistancePointToLine
  7. VTK:图片之ImageOpenClose3D
  8. OpenCV捕获格雷码模式
  9. Qt Creator浏览项目内容
  10. OpenGL无边界的纹理实例