Java 基础3 - 类加载器

类加载器

写代码时写的是类,程序运行时使用的是对象,从类变成对象就要经历 “加载” 这个步骤。类加载器就是加载类的类,它负责把字节码文件加载到内存,创建对象。

用途

  1. 热部署
  2. 应用模块化与相互隔离
  3. 从不同地方灵活加载

三种类加载器

  1. 启动类加载器

    Bootstrap ClassLoder ,加载 Java 常用基础类,主要位于 <JAVA_HOME>/lib/rt.jar

  2. 扩展类加载器

    Extension ClassLoder ,加载 Java 扩展类,主要位于 <JAVA_HOME>/ext

  3. 应用程序类加载器

    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 中国大陆许可协议进行许可。

posted @   为何匆匆  阅读(110)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起