类加载的过程---验证和准备

一、验证

  1. 什么是验证?

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

  2. 为什么要验证?

    很多人都在想, java文件编写的格式等都是按照虚拟机规范来的,如果java文件有错误,都无法编译成class文件。既然编译器已经保证了正确性,为什么还要在类加载的过程中验证呢?

    想到这个问题的人,自然是喜欢动脑经,喜欢想问题。原因很简单,class文件并不一定是从java源文件编译而来。在字节码层面上,java源代码无法做到的事情都是可以做到的。这个时候,如果虚拟机不做任何验证,会危害无穷的。

  3. 验证有哪些环节

    验证环节: 文件格式验证、元数据验证、字节码验证、符号引用验证。

二、准备

  1. 什么是准备阶段

    准备阶段是正式给类变量分配内存并且设置类变量初始值的阶段,这些变量所使用的内存都将在访法区分配。

  2. 注意事项
    (1) 这里进行内存分配的紧紧是类变量(被static关键字修饰的变量),而不包括实例变量,实例变量将会在对象实例化时一起分配在堆中。
    (2)这里所说的初始值,“通常情况下”是数据类型的零值。 譬如: private static int val = 123;

    (3) 非“通常情况下”,如果字段的字段属性表中存在 ”常量值“ 属性。那准备阶段就会初始化为指定的值。 譬如: private final static int val = 123;

原文地址:https://www.cnblogs.com/aDiot/p/5073705.html