前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ClassLoader 类加载器

ClassLoader 类加载器

作者头像
用户3112896
发布2019-09-26 15:22:14
8350
发布2019-09-26 15:22:14
举报
文章被收录于专栏:安卓圈安卓圈

*Java中的ClassLoader*

1.系统类加载器包括3种:

  1)Bootstrap ClassLoader(引导类加载器)

  C/C++代码实现的加载器,用于加载指定的JDK的核心类库,比如java.lang.、java.uti.等这些系统类。Java虚拟机的启动就是通过Bootstrap ClassLoader创建一个初始类来完成的。

  2)Extensions ClassLoader(拓展类加载器)

  Java中的实现类为ExtClassLoader,提供了除了系统类之外的额外功能

  3)Application ClassLoader(应用程序类加载器)

  Java中的实现类为AppClassLoader

2.Custom ClassLoader(自定义类加载器)通过继承java.lang.ClassLoader类的方式来实现自己的类加载器

3.ClassLoader的继承关系

1)ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能

2)SecureClassLoader继承了抽象类ClassLoader,但SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader的安全性

3)URLClassLoader继承自SecureClassLoader,可以通过URL路径从jar文件和文件夹中加载类和资源

4)ExtClassLoader和AppClassLoader都继承自URLClasLoader,它们都是Launcher的内部类,Launcher是java虚拟机的入口应用,ExtClassLoader和AppClassLoader都是在Launcher中进行初始化的

4.类加载器查找Class所采用的是双亲委托模式,好处是

  1)避免重复加载,如果已经加载过一次Class,可以直接读取已经加载的Class

  2)更加安全,无法自定义类来替代系统的类

*Android中的ClassLoader*

1.系统类加载器包括3种:

  1)BootClassLoader

  Android系统启动时使用其来预加载常用类,由Java实现的

  2)PathClassLoader

  Android系统使用其来加载系统类和应用程序额的类

  3)DexClassLoader

  可以加载dex文件以及包含dex的压缩文件(apk和jar文件),不管加载哪种文件,最终都要加载dex文件

2.ClassLoader的继承关系

1)ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能。BootClassLoader是它的内部类

2)SecureClassLoader类和JDK8中的SecureClassLoader类的代码是一样的,它继承了抽象类ClassLoader。SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader的安全性

3)URLClassLoader类和JDK8中的URLClassLoader类的代码是一样的,它继承自SecureClassLoader,用来通过URL路径从jar文件和文件夹中加载类和资源

4)InMemoryDexClassLoader是Android 8.0新增的类加载器,继承自BaseDexClassLoader,用于加载内存中的dex文件

5)BaseDexClassLoader继承自ClassLoader,是抽象类ClassLoader的具体实现类,PathClassLoader、DexClassLoader和InMemoryDexClassLoader都继承自它

3.实现自定义ClassLoader的步骤

  1)定义一个自定义ClassLoader并继承抽象类ClassLoader

  2)复写findClass方法,并在findClass方法中调用defineClass方法

4.ClassLoader查找流程

*Java和Android的ClassLoader的区别*

1.Java的引导类加载器是由C++编写的,Android中的引导类加载器则是由Java编写的

2.Android的继承关系要比Java继承关系复杂一些,提供的功能也多

3.由于Android中加载的不再是Class文件,因此Android中没有ExtClassLoader和AppClassLoader,替代它们的是PathClassLoader和DexClassLoader

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 安卓圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档