深入理解Java类加载器

基本概念

JVM使用JAVA类

Java源程序(.java 文件)在经过Java 编译器编译之后就被转换成Java字节码(.class 文件)。类加载器负责读取Java字节码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newInstance()方法就可以创建出该类的一个对象

ClassLoader类介绍

根据一个指定类,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例

方法说明
getParent()返回该类加载器的父类加载器
loadClass(String name)启动类加载
defineClass(String name, byte[] b, int off, int len)完成类的加载 final
getSystemClassLoader()获取系统类加载器 static
类加载器的树状结构

类加载器的树状结构
说明:对应的是类的双亲委派机制的逻辑关系

启动(Bootstrap)类加载器
  • 加载JAVA核心库
  • 用本地代码实现的类加载器,不继承java.lang.ClassLoader
  • 无法直接获取引用并使用
扩展(Extension)类加载器
  • 加载JAVA的扩展库
  • getParnet()返回null
系统(System)类加载器
  • 根据应用的类路径(CLASSPATH)来加载类
类加载双亲委派机制

就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载

初始化加载器:启动类的加载过程,通过调用loadClass来实现
定义加载器:真正完成类的加载工作,通过调用defineClass来实现

在虚拟机判断两个类是否相同,使用的是类的定义加载器和类的全名
同一类加载器实例,同名的类仅加载一次,下次通过取缓存获取Class实例的对象
两种类加载器的关联之处在于:一个类的定义加载器是它引用(使用)的其它类的初始加载器

自定义类加载器

场景1:应用通过网络传输的加密字节码,此时需要先解密再定义类
场景2:加载存储在文件系统上的 Java 字节代码

父类加载器是加载此类加载器 Java 类的类加载器(一般为系统类加载器)

总结

它使得动态安装和更新软件组件成为可能

参考文献

深入理解Java类加载器(1):Java类加载原理解析
深入探讨 Java 类加载器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值