Java 基础3 - 类加载器
类加载器
写代码时写的是类,程序运行时使用的是对象,从类变成对象就要经历 “加载” 这个步骤。类加载器就是加载类的类,它负责把字节码文件加载到内存,创建对象。
用途
- 热部署
- 应用模块化与相互隔离
- 从不同地方灵活加载
三种类加载器
-
启动类加载器
Bootstrap ClassLoder
,加载 Java 常用基础类,主要位于<JAVA_HOME>/lib/rt.jar
-
扩展类加载器
Extension ClassLoder
,加载 Java 扩展类,主要位于<JAVA_HOME>/ext
-
应用程序类加载器
Application ClassLoder
,程序启动时默认创建这种加载器,没什么特殊指定就用它了,也叫系统类加载器。
这三种类加载器的工作方式使用了双亲委派机制,应用程序类加载器的父级是扩展类加载器,扩展类加载器的父级是启动类加载器,注意这并不是继承关系。子列加载一个类时,先通过父级加载,父级加载不到才自己尝试加载。可以自己指定使用什么加载器进行加载,但有些特定的类还是不允许指定加载器的,是为了防止乱搞。
加载一个类可以使用 loadClass()
方法,和 Class
类的 forName()
方法不同之处是 loadClass()
不会执行类的初始化代码(比如 static
语句)。
自定义 ClassLoader
一般而言,继承类 ClassLoader
,重写 findClass()
方法就可以。之后使用自己的逻辑寻找 class 文件字节码的字节形式,找到后,使用如下方法转换为 Class
对象:
public finae Class<?> defineClass(String name, byte[] b, int off, int len)
只要拿到了类的 byte
形式的数据就可以创建出它的对象,也就是说不再限于从本地读取,从远程存储读取也是可以的。
本文作者:为何匆匆
本文链接:https://www.cnblogs.com/nyfblog/p/16519126.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步