面试题:你知道类的加载过程吗?

面试题:你知道类的加载过程吗?

  • 面试题:你知道类的加载过程吗?
    • 问题分析
    • 问题解答
      • 加载过程
      • 连接过程
        • 验证
        • 准备
        • 解析
      • 初始化
  • 其他

面试题:你知道类的加载过程吗?

问题分析

类的加载过程是一个比较基础也是面试中经常问到的问题,需要专门去记忆下。

问题解答

类的加载过程一般分为三个阶段,加载、连接、初始化。

加载过程

加载过程中虚拟机需要完成以下三件事情:

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

连接过程

连接过程又可分为三个过程,分别为:验证、准备、解析。

验证

验证加载进来的数据是否符合虚拟机的规范,并且不会危害JVM虚拟机的安全。验证包括文件格式验证,元数据验证,字节码验证,符号引用验证。

准备

静态变量分配内存空间,并设置默认值;给静态常量直接赋初值。

解析

解析过程是将常量池内的符号引用替换成直接引用。主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析.
将源代码编译成.class文件时,编译器是不知道被编译的类中所引用的类、方法或者变量他们的引用地址在哪里,所以只能用符号引用来表示,而符号引用不是真正的引用,不能没有指向引用的对象所在的地址,所以解析阶段就是为了把这个符号引用转化成为真正的地址的阶段.

初始化

在准备阶段,类变量已经经历过一次初始化,在这个阶段,则是执行类的初始化方法(),类初始化方法是由编译器自动收集类中的所有类变量的赋值动作静态语句块(static块)中的语句合并产生的。即执行给类变量赋值和执行静态代码块里面的内容,如果这个类继承了父类,那么先执行父类的类变量赋值和静态代码块的内容。

其他

  • 可以使用虚拟机参数-XX:+TraceClassLoading追踪类的加载过程。
  • 在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法, 另一个是实例的初始化方法在jvm加载类的初始化阶段调用,包括静态变量初始化语句和静态块的执行。在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。

你可能感兴趣的:(面试,JAVA)