类加载器ClassLoader

基本介绍

与普通程序不同的是。Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,Bootstrap ClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap ClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。

当运行一个程序的时候,JVM启动,运行BootstrapClassloader,该ClassLoader加载java核心API(ExtClassLoaderAppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

什么时候JVM会使用ClassLoader加载一个类呢?

当你使用java去执行一个类,JVM使用ApplicationClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。

似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢?

因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到:

  • 在执行非置信代码之前,自动验证数字签名

  • 动态地创建符合用户特定需要的定制化构建类

  • 从特定的场所取得java class,例如数据库中

事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。

应用服务器大都使用了ClassLoader技术,即使你不需要创建自己的ClassLoader,了解其原理也有助于更好地部署自己的应用。

——参考《百度百科》

PS:类加载器负责将类的class文件加载到内存中,生成相应的Class对象。

三大类加载器

引导类加载器BootStrapClassLoader

它加载java核心API,将从sun.boot.class.path寻找所需要的类,例如:rt.jar

PS:如果使用它加载的Class对象获取ClassLoader将会返回null。

扩展类加载器ExtClassLoader

它加载扩展的JavaClass,将从java.ext.dirs寻找所需要的类,例如:ext\*.jar

应用类加载器AppClassLoader

它加载应用程序自身的类,将从java.class.path寻找所需要的类

获得加载自己的类加载器

可以使用类.class.getClassLoader()加载,也可以使用类的对象.getClass().getClassLoader()加载。

类加载器的加载机制

全盘负责

类A如果要使用类B(内存中不存在),类A的类加载器C必须负责加载类B。

委托机制

类A的加载器如果要加载资源B,必须询问父类的类加载器是否加载过。

  • 如果加载,将直接使用。

  • 如果没有加载,则加载。

PS:采用全盘负责、委托机制保证一个class文件只会被加载一次,形成一个Class对象。

案例

package com.pc.classloader;import org.junit.Test;import sun.net.spi.nameservice.dns.DNSNameService;
/*** 类加载器:将class文件加载到内存生成对应的Class对象* * 问题:如何保证同一个class文件不被重复加载呢?* * 全盘委托机制* 1.应用类加载器获得TestClassLoader.class,并没有将它加载到内存,而是委托扩展类加载器;* 2.扩展类加载器获得TestClassLoader.class,它也没有加载,委托给引导类加载器;* 3.引导类加载器获得TestClassLoader.class,它会加载自己负责的文件到内存并生成Class对象,将其它下发给扩展类加载器;* 4.扩展类加载器获得TestClassLoader.class,它会加载自己负责的文件到内存并生成Class对象,将其它下发给应用类加载器;* 5.应用类加载器获得TestClassLoader.class,加载剩余的class文件到内存并生成对应的Class对象。* * * @author Switch* @date 2016年10月26日    * @version V1.0*/
public class TestClassLoader {@Testpublic void test(){//1.应用类加载器(AppClassLoader)ClassLoader classLoader = TestClassLoader.class.getClassLoader();System.out.println(classLoader);//2.扩展类加载器(ExtClassLoader)ClassLoader classLoader2 = DNSNameService.class.getClassLoader();System.out.println(classLoader2);//3.引导类加载器(null,获取不到,其加载为C、C++代码)ClassLoader classLoader3 = String.class.getClassLoader();System.out.println(classLoader3);}
}

类加载器ClassLoader相关推荐

  1. Java虚拟机学习 - 类加载器(ClassLoader)

    类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...

  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  3. 【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )

    文章目录 一.Android 类加载器 1.ClassLoader 抽象类 2.BootClassLoader 3.BaseDexClassLoader 4.PathClassLoader 5.Dex ...

  4. 【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )

    文章目录 一.类加载器 二.类加载的双亲委托机制 一.类加载器 Java 虚拟机 ClassLoader 类加载器 : Bootstrap ClassLoader : 启动类加载器 , 该 加载器由 ...

  5. java类加载器_类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...

  6. JVM之类加载器ClassLoader

    JVM之类加载器ClassLoader 本文目录 JVM简介 类加载器解析 1. JVM简介 ①. JVM是运行在操作系统之上的,它与硬件没有直接的交互 ②. JVM体系结构概览 注: 2. 类装载器 ...

  7. 类加载器ClassLoader的角色

    类加载器ClassLoader的角色

  8. Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)

    Student s = new Student(); s.play(); Student s2 = new Student(); 以上代码的执行流程如下: JVM 作为操作系统的一个迚程在系统中执行, ...

  9. java的类加载器ClassLoader

    类在执行之前会执行三个步骤:加载 ->   连接  -> 初始化 1.java中类的加载 java 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方 ...

最新文章

  1. R构建对数回归模型(Logarithmic Regression)
  2. 设置Windows7各种睡眠方式
  3. android检查usb广播,Android 检测USB 音频设备
  4. 算法导论之用于不相交集合的数据结构
  5. 《OpenGL编程指南(原书第9版)》——导读
  6. huizhang要约会
  7. AOP技术基础(转)
  8. 计算机裸机与应用程序及用户之间的桥梁是,2016计算机二级《MS Office》单选试题与解析...
  9. @Modules( ... ) 多个包路径问题
  10. Tensorflow学习笔记(三)
  11. 周获 4700 Star 全球疫情数据可视化系统,超轻量级中文 OCR……GitHub 一周热点速览...
  12. Ample Sound Ample Bass Metal Ray5 for mac - 低弦音软件
  13. kali之搜狗输入法安装下载
  14. 精选16款超精美的XP登录界面下载
  15. malloc函数和free函数的使用方法解析
  16. 单片机驱动DM9000网卡芯片
  17. 考研数学:常见的的泰勒公式
  18. Delphi D10.X中实现安卓中文语音合成(中文朗读)就这么简单
  19. cub数据集多少张图片_细粒度分类数据集汇总
  20. 基于Tofu的热红外、多波段目标识别跟踪系统

热门文章

  1. 【Python】汉诺塔问题
  2. 无法将输入值传递给JavaScript变量
  3. vulcan 编程_如何用Next代替流星— Vulcan Next Starter简介
  4. 利用 assistant_如何使用Dialogflow对Google Assistant操作实施本地履行
  5. wordpress忘记登录密码,更改域名的办法。
  6. 2048游戏代码python_200 行代码实现简易版 2048 游戏 (python)
  7. Python 3.8 已发布,现在是切换至新版本的好时机吗?
  8. vim莫名假死的解决办法
  9. Apache Flink新场景——OLAP引擎
  10. 从 Flink 应用场景出发,了解它的设计思路