--摘自《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的更多相关文章

  1. (转)理解classloader

    ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见.理解ClassLoader的加载机制,也有利于我们编写出更高效的代码.ClassLo ...

  2. 深入理解ClassLoader

    深入理解ClassLoader ClassLoader 作用 负责将 Class 加载到 JVM 中 ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoade ...

  3. 理解ClassLoader工作机制

    package com.ioc; public class Test { public static void main(String[] args) throws ClassNotFoundExce ...

  4. 深入理解ClassLoader(五)—类的卸载

    原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101413730764/?suggestedreading&wumi ...

  5. 深入理解ClassLoader工作机制(jdk1.8)

    ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中    审查每个类由谁加载(父优先的等级加载机制)    将 Class 字节码重新 ...

  6. 一个例子深入理解ClassLoader

    文件类加载器,该加载器重载了loadClass方法,逻辑是只读取文件来加载类,不委托给父类加载器进行加载 package com.ydd.study.hello.classloader; import ...

  7. 理解ClassLoader基本原理

    当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:        bootstrap classloader                 |        exte ...

  8. 深入理解ClassLoader(四)—类的父委托加载机制

    上几次我们介绍到了JVM内部的几个类加载器,我们来重新画一下这个图,再来看一下他们之间的关系.

  9. ClassLoader简单介绍

    要理解ClassLoader,我们可以通过what.how两个方面来解释 一.what:什么事ClassLoader? 1.ClassLoader可以是将class文件加载到JVM方法区. 2.Cla ...

随机推荐

  1. java频繁new对象的优化方案

    在实际开发中,某些情况下,我们可能需要频繁去创建一些对象(new),下面介绍一种,我从书上看到的,可以提高效率的方法. 首先,对于将会频繁创建的对象,我们要让这个类实现Cloneable接口,因为这个 ...

  2. LeetCode-两数之和

    Question 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...

  3. JAVA中循环删除list中元素的方法总结【转】

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  4. System系统类

    System系统类 : 主要的作用是用于获取系统的一个参数. System类需要掌握的方法: arraycopy(Object src, int srcPos, Object dest, int de ...

  5. Spring rabbitMq 中 correlationId或CorrelationIdString 消费者获取为null的问题

    问题 在用Spring boot 的 spring-boot-starter-amqp   快速启动 rabbitMq 是遇到了个坑 消费者端获取不到:correlationId或Correlatio ...

  6. “不能在dropdownlist中选择多个项

    DropDownList.ClearSelection(); DropDownList.SelectedItem.Text = "value值";

  7. windows 下的 Rsync 同步

    整理一下 windows 下的 rsync 文件同步. Rsync下载地址: 链接:https://pan.baidu.com/s/1nL0Ee_u76ytWKUFMeiKDIw 提取码:52in 一 ...

  8. golang _下划线占位符代替需要释放的资源的问题

    golang中_有两种作用,一种用在import中,比如这样 import _ "github.com/go-sql-driver/mysql" 表示并不需要导入整个包,只是执行这 ...

  9. 20175315 《Java程序设计》第6周学习总结

    20175215 <Java程序设计>第6周学习总结 教材学习内容总结 第七章主要讲的是内部类,匿名类,异常类等等. 内部类:Java支持在一个类中定义另一个类,称作内部类,包含内部类的类 ...

  10. 项目Alpha冲刺(团队)-第一天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第一天冲刺的项目进展.问题困难.心得体会 ...