类加载机制
Java程序运行,首先会将编写的Java代码转换成字节码,然后加载到内存中,最后被JVM解释执行。本文讲介绍类的加载过程
虚拟机加载对应的class文件,会经过5个流程
一、加载
就是将class文件加载到虚拟机的内存中,在这个阶段,需要完成三件事情:
1.通过类的全限定名来获取这个类的二进制字节流——class文件
2.将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
3.在内存中生成这个类对应的class对象,作为各种数据的访问入口
有8种情况会要求立即进行对应类的初始化,而加载在初始化之前,
其实也可以理解会加载类的时机。
1.使用关键字new对象的时候
2.使用或者设置类的静态变量的时候,需要注意的是,使用被final修饰的静态变量,不会导致类加载,因为其已经在编译期写入常量池中。
3.使用类的静态方法的时候
4.初始化一个类的时候,发现其父类还没有加载,则需要先加载父类
5.虚拟机启动的时候,首先会对主方法所在类进行加载
6.对类进行反射调用的时候
7.使用JDK动态代理的时候
8.被default关键字修饰的接口方法,若这个接口的实现类加载,那么这个接口需要提前加载。
以上的情况都是基于对应类没有加载时,会被要求立即进行加载,同时以上的情况称为对类的主动引用,其他情况称为被动引用,被动引用不会触发对应类的加载,下面举几种被动引用的例子
1.通过子类引用父类的静态变量,不会导致父类初始化
public class Super {
static {
System.out.println("Super init");
}
public static String name = "Super";
}
public class Sub extends Super{
static