加载

  • 通过一个类的全限定名来获取定义此类的二进制字节流。
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  • 在java虚拟机规范中并没有强行要求这三点具体实现;所以就可以很开放的出现各种形式;
    • 就比如,去字节流过程,可以从jar,ear,war等格式的文件中取出。
    • 可以从网络中取出
    • 动态代理等

验证

        因为虚拟机不只是额能运行java的class文件。任何语言能编译成class都可以在虚拟机上运行。所以,在字节流进入虚拟机之前先检查其合法性就很有必要。就像在喝水前检查是不是有毒,如果有毒,那么水到肚子里,整个人都会出问题。不合法字节流进入虚拟机可能会导致整个虚拟机崩溃。

校验方式:

  • 文件格式验证:保证输入的子节流正确解析到方法区内
  • 是否以魔数0xCAFEBABE开头;
  • 常量池中的常量是否有不被支持的常量类型;
  • 指向常量的各种索引值是否指向了不存在的常量或不符合类型的常量;
  • 是否不符合编码 utf-8
  • class文件中是否部分被删除,或附加其他信息
  • 等等等等,还有很多验证;

元数据验证:检查了类的元数据信息语义校验

  • 类是否有父类,
  • 父类是否不可继承;
  • 如果这个类不是抽象类,那他是否实现了所有要求实现的方法;
  • 类中的字段方法是否与父类矛盾

字节码验证:

  • 任意时刻操作数栈的数据类型与指令代码序列都能配合工作,保证不会出现不同的类型相匹配的问题;例如一个int的数据,却按照long加载;
  • 保证任何跳转指令都不会跳转都方法体外;
  • 保证类型转换不会转换成毫无关系的完全不相干的数据类型

符号引用验证:

  • 通过字符串描述全限定名称来看是否能找到对应的类;
  • 在类中是否有符合描述的字段和方法;
  • 符号中的类,字段,方法的课访问性(访问权限)是否可被当前类访问;

准备:

        简单来说,就是初始化所有静态变量为0,false,null;等

解析:

        简单上来说,就是将字符与地址对应起来。像什么方法,变量。让他们与地址对应起来;

初始化:

        执行·()方法.初始化。

他有自己的执行顺序:最主要的就是,用到谁了谁就会初始化;

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐