理解ClassLoader
--摘自《Android进阶解密》
*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
理解ClassLoader的更多相关文章
- (转)理解classloader
ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见.理解ClassLoader的加载机制,也有利于我们编写出更高效的代码.ClassLo ...
- 深入理解ClassLoader
深入理解ClassLoader ClassLoader 作用 负责将 Class 加载到 JVM 中 ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoade ...
- 理解ClassLoader工作机制
package com.ioc; public class Test { public static void main(String[] args) throws ClassNotFoundExce ...
- 深入理解ClassLoader(五)—类的卸载
原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101413730764/?suggestedreading&wumi ...
- 深入理解ClassLoader工作机制(jdk1.8)
ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中 审查每个类由谁加载(父优先的等级加载机制) 将 Class 字节码重新 ...
- 一个例子深入理解ClassLoader
文件类加载器,该加载器重载了loadClass方法,逻辑是只读取文件来加载类,不委托给父类加载器进行加载 package com.ydd.study.hello.classloader; import ...
- 理解ClassLoader基本原理
当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader | exte ...
- 深入理解ClassLoader(四)—类的父委托加载机制
上几次我们介绍到了JVM内部的几个类加载器,我们来重新画一下这个图,再来看一下他们之间的关系.
- ClassLoader简单介绍
要理解ClassLoader,我们可以通过what.how两个方面来解释 一.what:什么事ClassLoader? 1.ClassLoader可以是将class文件加载到JVM方法区. 2.Cla ...
随机推荐
- django-个人博客登录及权限验证功能的实现
完成注册后随即开始进行登录,登录后页面显示登录者的名称 实现如下: 前端页面html,对session进行判断,有值则显示登录者的名字 ,无值则显示注册字样: 后台views函数 首先对验证码进行验 ...
- centos备份多个数据库
#/bin/bash# the backup dateDATE=`date +%Y%m%d%H%M`#backup pathBACKUP_PATH=/home/backup/mysqldata#get ...
- python—shutil模块
该模块拥有许多文件或文件的删除.移动.复制.重命名等功能. 1.copy():复制文件 格式:shutil.copy(来源文件,目标地址) 返回值:返回复制之后的路径 2.copy2():复制文件和状 ...
- 423 重温Java Script and jQuery 葵花宝典 Bootstrap
Bootstrap需要引的三个文件 <link rel="stylesheet" href="css/bootstrap.css"> 表格元素 ...
- 415 DOM 查找列表框、下拉菜单控件、对表格元素/表单控件进行增删改操作、创建元素并且复制节点与删除、 对表格操作、通用性和标准的事件监听方法(点击后弹窗效果以及去掉效果)
DOM访问列表框.下拉菜单的常用属性: form.length.options.selectedindex.type 使用options[index]返回具体选项所对应的常用属性:defa ...
- 记一次被吊打的排位赛(writeup)
XMAN通行证 给了一串疑似base64的东西: a2FuYmJyZ2doamx7emJfX19ffXZ0bGFsbg== 解密后得到: kanbbrgghjl{zb____}vtlaln 想到应该是 ...
- HTTP协议详解(四)
接着第三篇继续学习.... 9 Cookie和Session的比较 Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. S ...
- Go语言--基础语法笔记
### 换了工作,好久没有添加新文章了,本来是想更新到github上的,想想还是在博客里放着,感觉以前的文章都没有很仔细,都只是问题处理的记录, 以后想新加一些整理的笔记也好 ### 主要内容 2.1 ...
- WPF 10天修炼 第六天- 系统属性和常用控件
WPF系统属性和常用控件 渐变的背景色 WPF中的前景色和背景色不同于传统Winform的设置,这些属性都是Brush类型的值.在XAML中,当为这些属性设置指定的颜色后将被转换为SolidColor ...
- 让你的Spring Boot应用快速运行在Docker上面
前置条件: 1. 服务器(我这边是CentOS7)上已经安装了Docker(安装步骤很简单,可以参考我上一篇博客) 2.服务器上已经安装了Java和Maven 在满足以上条件后,我们就可以开始了: 1 ...