Java虚拟机加载类的全过程包括:加载、验证、准备、解析、初始化。验证、准备、解析叫连接过程。今天我们讲加载。
首先明确“加载”是“类加载”的一个过程,不要混淆。加载过程中,虚拟机需要完成下列三个事情:

  1. 通过一个类的全限定名获取定义此类的二进制字节流;
  2. 将这个字节流所代表的静态存储结构转化为方法区运行时的数据结构;
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

虚拟机的这三点要求不算具体,因此虚拟机实现与具体应用的灵活度都是相当大的。就拿第一条说,他仅仅要求“通过一个类的全限定名获取定义此类的二进制字节流”,并没有指明二进制字节流要从Class文件获取,也没说要怎样获取,从哪里获取。所以说java虚拟机的设计团队在加载阶段搭建了一个很广阔的舞台,许多举足轻重的java技术都建立在这个舞台上,比如:

  • 从ZIP包中获取,这是jar,war格式的基础
  • 从网络中获取,这种场景的典型应用就是Applet
  • 运行时计算生成,这种场景使用的最多的就是动态代理技术,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流
  • 由其他文件生成,典型的场景是JSP应用,即JSP文件生成对应的Class类
  • 从数据库中读取,这种场景相对少见

相对于类加载过程的其他阶段,一个非数组类的加载阶段(准确的说,是加载阶段中获取二进制字节流的动作,有的加载阶段不获取二进制字节流)是开发人员 可控性最强的,因为加载阶段即可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成,开发人员可以通过定义自己的类加载器去控制字节流的获取方式(即重写一个类的loadClass方法)。

对于数组类而言,情况不同。数组类本身不通过类加载器创建,他是由java虚拟机直接创建。但数组类与类加载器的关系任然很密切,因为数组类的元素类型(指的是数组去掉所有维度的类型)最终要靠类加载器创建,一个数组类(下面简称C)创建过程遵循以下规则:

  • 如果数组的组件类型(指的是数组去掉一个维度的类型)是引用类型,那就递归采用本节中定义的加载过程去加载这个组件类型,数组C将在加载该类型组件的类加载器的类名称空间上被标识(这点很重要,一个类必须与类加载器一起确定唯一性)
  • 如果数组的组件类型不是引用类型(例如int[]数组),Java虚拟机将会把数组C标记为与引导类加载器关联
  • 数组类的可见性与他的组件类型的可见性一致,如果组件类型不是引用类型,那数组类的可见性将默认为public

加载阶段完成之后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体数据结构。然后在内存中实例化一个java.lang.Class类的对象(并没有明确规定是在java堆中,对于HotSpot虚拟机而言,Class对象比较特殊,他虽然是对象,但是放在方法区中),这个对象将作为程序访问方法区中的这些类型数据的外部接口。
加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能开始了,但是这些夹在加载阶段之中进行的动作,任然属于连接阶段的内容,这两个阶段的开始时间任然保持着固定的先后顺序。

Java类加载机制--类加载过程(加载)相关推荐

  1. 【Java类加载机制】深入加载器

    加载的全过程,分为三步:加载.链接(验证.准备.解析).初始化.(使用.卸载) 加载 字节码的来源: 硬盘上的class文件 网络上的字节码(服务器.其他程序发来的) jar包.zip文件 数据库中的 ...

  2. bootstraptable treeGrid 懒加载_Java类加载机制及自定义加载器

    一:ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载. 隐式加载:程序 ...

  3. java ClassLoader机制和如何加载外部class文件(含代码)

    Java类的生命周期 生命周期有:加载(Loading)-->验证(Verification)-->准备(Preparation)--->解析(Resolution)-->初始 ...

  4. java代码从编译到加载执行的过程

    代码编译 在刚接触java时,我们都知道通过javac命令将java源码文件编译成.class字节码文件,这是由编译器来完成的. 包括泛型擦除属于编译时期的语法糖. .class字节码文件是跨平台的, ...

  5. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  6. java一个类多次加载_据说99.99%的人都会答错的类加载问题

    概述 首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题. 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗? 请仔 ...

  7. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  8. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一.类加载时机 1.隐式加载 2.显式加载 二.类加载步骤 一.类加载时机 1.隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new 关键字 ...

  9. 查看类的实现类mac_自定义类加载器实现热加载

    一.实现的需求 当一个java被修改后,系统无需重启,替换的类立即生效,这里以Work.java为例 二.实现的思路 1)难点分析 当项目在执行的时候,我们修改了Work.java,这个类的class ...

  10. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记5 Core组件进阶(三)分离合并颜色通道
  2. 贝尔实验室发布6G通信白皮书
  3. jdbctemplate oracle xml文件,Spring JDBCTemplate使用JNDI数据源
  4. OAuth2.0授权码模式学习
  5. 操作系统实验报告18:硬盘柱面访问调度算法
  6. 关于如何存储便于网上浏览的电子书籍
  7. 太强了!用200个LED做一个智能手表
  8. 编程语言_Java方法参数...是什么意思_面试题008
  9. ZOJ3067_Nim
  10. 图着色问题(超详细!!!)
  11. 腾讯云后端面试15问(6年工作经验)
  12. Kotlin的SAM转换
  13. hadoop快速自我学习--hadoop平台管理与维护
  14. 你绝对能懂的“腐烂的橘子”解法
  15. 草履虫纳米机器人_草履虫大小的微型机器人:由激光驱动,未来可用于显微外科手术!...
  16. 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
  17. VFB组件:Picture控件(画板)
  18. 实现全选和取消全选功能
  19. 码学堂P1686 Hello, World!题解
  20. 苹果浏览器safari推介

热门文章

  1. linux ad7705驱动程序,tm7705_51单机片驱动
  2. 怎么在计算机中添加用户账户,使用net user命令在win7电脑中添加账户的步骤
  3. Windows查看所有的端口
  4. linux添加变色龙引导,变色龙引导下载
  5. 教你轻松删除PDF文件中的空白页
  6. 浙江省二级计算机vfp,浙江省高校计算机等级考试大纲(二级——VisualFoxPro语言程序设计大纲)...
  7. 七天学完Vue之第一天学习笔记(Vue的介绍,时间修饰符以及常用指令)
  8. 如何判断电脑已感染“磁碟机”病毒?
  9. Stardict 81部中文词典下载
  10. 计算机公式与函数乘法,excel里减法函数是哪个?-excel函数公式乘法