“加载”(Loading)阶段是“类加载”(Class Loading)过程的第一个阶段,在此阶段,虚拟机需要完成以下三件事情:

1、 通过一个类的全限定名来获取定义此类的二进制字节流。

2、 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3、 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。

加载阶段即可以使用系统提供的类加载器在完成,也可以由用户自定义的类加载器来完成。加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始。

5.2 验证

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

Java语言本身是相对安全的语言,使用Java编码是无法做到如访问数组边界以外的数据、将一个对象转型为它并未实现的类型等,如果这样做了,编译器将拒绝编译。但是,Class文件并不一定是由Java源码编译而来,可以使用任何途径,包括用十六进制编辑器(如UltraEdit)直接编写。如果直接编写了有害的“代码”(字节流),而虚拟机在加载该Class时不进行检查的话,就有可能危害到虚拟机或程序的安全。

不同的虚拟机,对类验证的实现可能有所不同,但大致都会完成下面四个阶段的验证 :文件格式验证、元数据验证、字节码验证和符号引用验证。

1、文件格式验证,是要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。如验证魔数是否0xCAFEBABE;主、次版本号是否正在当前虚拟机处理范围之内;常量池的常量中是否有不被支持的常量类型……该验证阶段的主要目的是保证输入的字节流能正确地解析并存储于方法区中,经过这个阶段的验证后,字节流才会进入内存的方法区中存储,所以后面的三个验证阶段都是基于方法区的存储结构进行的。

2、元数据验证,是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求。可能包括的验证如:这个类是否有父类;这个类的父类是否继承了不允许被继承的类;如果这个类不是抽象类,是否实现了其父类或接口中要求实现的所有方法……

3、字节码验证,主要工作是进行数据流和控制流分析,保证被校验类的方法在运行时不会做出危害虚拟机安全的行为。如果一个类方法体的字节码没有通过字节码验证,那肯定是有问题的;但如果一个方法体通过了字节码验证,也不能说明其一定就是安全的。

4、符号引用验证,发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在“解析阶段”中发生。验证符号引用中通过字符串描述的权限定名是否能找到对应的类;在指定类中是否存在符合方法字段的描述符及简单名称所描述的方法和字段;符号引用中的类、字段和方法的访问性(private、protected、public、default)是否可被当前类访问

验证阶段对于虚拟机的类加载机制来说,不一定是必要的阶段。如果所运行的全部代码确认是安全的, 可以使用 -Xverify:none 参数来关闭大部分的类验证措施,以缩短虚拟机类加载时间。

5.3 准备

准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。

public static int value=123;//在准备阶段value初始值为0 。在初始化阶段才会变为123 。

5.4 解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

符号引用(Symbolic Reference):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。

直接引用(Direct Reference):直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是与虚拟机实现的内存布局相关的,如果有了直接引用,那么引用的目标必定已经在内存中存在。

5.5 初始化

类初始化是类加载过程的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。

初始化阶段是执行类构造器()方法的过程。()方法是由编译器自动 收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的 。

6 题目分析

上面很详细的介绍了类的加载时机和类的加载过程,通过上面的理论来分析本文开门见上的题目

java loadclass_【java 类加载的深入研究1】loadClass()的研究相关推荐

  1. Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加载器 类加载器就是用来加载类的东西!类加载器也是一个类:ClassLoader 类加载 ...

  2. Java反射 - 动态类加载和重载

    可以使用Java在运行时加载和重新加载类,虽然它不像人们希望的那样简单. 本文将解释何时以及如何在Java中加载和重新加载类. ClassLoader Java应用程序中的所有类都使用java.lan ...

  3. 用Java Instrumentation 在类加载时添加记录

    用Java Instrumentation 在类加载时添加记录 发布者:xanadu0214   来源:网络转载   发布日期:2013年11月06日   Java学习交流群:471651004 在分 ...

  4. java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...

    Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...

  5. 一次性搞清Java中的类加载问题

    摘要:很多时候提到类加载,大家总是没法马上回忆起顺序,这篇文章会用一个例子为你把类加载的诸多问题一次性澄清. 本文分享自华为云社区<用1个例子加5个问题,一次性搞清java中的类加载问题[奔跑吧 ...

  6. 【Java】java.util.Objects 工具类方法研究

    [Java]java.util.Objects 工具类方法研究 Objects 与 Object 区别 Object 是 Java 中所有类的基类,位于java.lang包. Objects 是 Ob ...

  7. Java单元测试和类加载

    Java单元测试和类加载 回顾: 1 Lambda表达式:相等于匿名内部类,实现代码作为方法的参数传统.函数式接口 变量=(参数列表)->{方法体};注意: ->操作符 分成两部分 左侧: ...

  8. Java虚拟机中类加载机制详解

    Java虚拟机中类加载机制详解 1,什么是java类加载机制 **首先在java中,是通过编译来生成.class文件(可能在本地,或者网页下载),java的类加载机制就是 将这些.class文件加载到 ...

  9. Java和SpringBoot类加载机制

    文章目录 一.SPI介绍 1. SPI机制 2. SPI使用案例 二.Java类加载机制 1.双亲委派模型 2. 双亲委派模型缺陷 3. 使用线程上下文类加载器(ContextClassLoader) ...

  10. java中的类加载与双亲委派机制

    类加载是什么 把磁盘中的java文件加载到内存中的过程叫做类加载 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM. 有如下 User 类 package ...

最新文章

  1. java在文本框中输出数据_请教大神,程序结果怎么打印到JTextArea()的文本域里
  2. NetBeans Weekly News - Issue # 446 - Jul 20, 2010
  3. Cortex-M3的整体风景
  4. libuv 原理_nodejs如何利用libuv实现事件循环和异步
  5. 试图加载 Crystal Reports 运行时出现错误
  6. C语言程序设计(第三版)何钦铭著 习题2-1
  7. c语言计算机二级知识点总结,计算机二级考试C语言知识点总结
  8. Windows10中microsoft商店打不开解决办法
  9. html引用资源相对路径,超链接中的绝对路径和相对路径
  10. Win10+linux双系统共用蓝牙设备
  11. 丽台显卡测试软件,领先A卡62% 丽台7系显卡对比测试
  12. python中num函数是什么意思_如何理解python3函数中num的用法?
  13. android 手机 otg,对于安卓智能手机的OTG功能,你了解多少
  14. OFDM基带信号、射频信号及相应公式
  15. matlab 数值计算课 二阶微分方程-龙格库塔方法 ODE45
  16. 鸿蒙系统碰一碰,华为正式发布鸿蒙手机操作系统 “碰一碰”就可实现设备互联...
  17. word中图片批量修改
  18. strcat函数用法的一点看法
  19. 研究生发论文是先有idea再做实验,还是先做实验再有idea?
  20. [激光原理与应用-62]:激光器 - 光学 - 怎样测量光斑和光束质量?

热门文章

  1. 进程的调度策略与进程的状态
  2. c语言左(<<)右(>>)移
  3. 【JAVA SE】第四章 变量和方法
  4. 【转】(译)iOS Code Signing: 解惑详解
  5. [EOJ]2019 ECNU XCPC March Selection #1 F
  6. GDB同步显示源代码——layout
  7. 毕业设计10-22星期日
  8. VMware 上Ubuntu虚拟机(15.1) ping不通物理主机(win10),但windows可以ping通虚拟机的问题解决方法...
  9. javascript之继承
  10. python面试题37道(附答案)看完面试不愁了