深入理解JAVA类加载器

来源:互联网 发布:华中科技大学网络计算 编辑:程序博客网 时间:2024/05/16 04:49

基本概念

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 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 易方达蓝筹 融通新蓝筹 华夏蓝筹 融通蓝筹 交银蓝筹 蓝筹 科技蓝筹 上投蓝筹 蓝筹投资 蓝筹权重股 蓝筹精选 创业板蓝筹 易方达蓝筹精选 易方达蓝筹精选005827 汇添富蓝筹稳健混合 融通新蓝筹基金净值 易方达蓝筹精选混合 160311华夏蓝筹 景顺精选蓝筹 交银蓝筹基金今日净值 交银蓝筹净值 添富蓝筹基金净值 上投大盘蓝筹基金净值 什么叫蓝筹股票 华夏蓝筹基金 招商蓝筹大盘基金 大蓝筹是什么意思 招商大盘蓝筹基金 交银施罗德蓝筹基金净值 蓝筹什么意思 融通新蓝筹今日净值 景顺精选蓝筹基金净值 华夏蓝筹分红公告 大蓝筹股票有哪些 华夏蓝筹基金分红 景顺蓝筹精选基金净值 160311华夏蓝筹基金 基金融通新蓝筹 华夏蓝筹基金净值今天 蓝筹股票有哪些 华夏蓝筹怎么样