类加载器

类加载器负责将 .class 文件(可能在磁盘上,可能在网络上)加载到内存中,并为之生成对应的 java.lang.Class 对象。

本文包含:

  1. 类加载器简介
  2. 类加载机制
  3. 创建并使用自定义的类加载器
  4. URLClassLoader 类

1. 类加载器简介

类加载器负责加载所有的类,系统为所有被载入内存的类生成一个 java.lang.Class 实例。一旦一个类被载入 JVM 中,同一个类就不会被再次载入了。
在这里插入图片描述
当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
编译上面程序,可以看到如下结果:
在这里插入图片描述
看到这个运行结果,可以明白为什么程序中可以使用 String、System 这些核心类库

2. 类加载机制

JVM 的类加载机制主要有以下三种:
在这里插入图片描述
类加载器之间的父子关系不是类继承上的父子关系,而类加载器实例之间的关系。
除了可以使用 Java 提供的类加载器之外,开发者也可以实现自己的类加载器,自定义的类加载器通过继承 ClassLoader 来实现。JVM 中这四种类加载器的层次结构如图所示:
在这里插入图片描述
下面程序示范了访问 JVM 的类加载器
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190713152702181.png?x-oss-process=image/w在这里插入图片描述
JVM 的根类加载器并不是 Java 实现的,而且由于晨曦通常无法访问根类加载器,因此访问扩展类加载器的父类加载时返回 null。

类加载器加载 Class 大致要经过如下 8 个步骤:
在这里插入图片描述在这里插入图片描述

3. 创建并使用自定义的类加载器

JVM 中除根类加载器之外的所有类加载器都是 ClassLoader 子类的实例,开发者可以通过扩展 ClassLoader 的子类,并重写该 ClassLoader 所包含的方法来实现 自定义的类加载器。

ClassLoader 类有如下两个关键方法:
在这里插入图片描述
如果需要实现自定义的 ClassLoader,则可以通过重写以上两个方法来实现,通常推荐重写 findClass() 方法,而不是重写 loadClass() 方法。

LoadClass() 方法的执行步骤如下:
在这里插入图片描述
从上面步骤可以看出,重写 findClass() 方法可以避免覆盖默认类加载器的父类委托、缓冲机制两种策略;如果重写 loadClass() 方法,则实现逻辑更为复杂。
在这里插入图片描述
此外,ClassLoader 里还包含如下一些普通方法:
在这里插入图片描述
使用自定义的类加载器,可以实现如下常见功能:
在这里插入图片描述

4. URLClassLoader 类

URLClassLoader 实现类是系统类加载器和扩展类生成器的父类(父类指类与类之间的继承关系)。它就可以从本地文件系统获取二进制文件来加载类,也可以从远程主机获取二进制文件来加载类。

在应用程序中可以直接使用URLClassLoader ,URLClassLoader 类提供了如下两个构造器:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值