1. Class Loader的概念和作用

Class Loader(类加载器)是Java虚拟机(JVM)的一个重要组成部分,负责将类的字节码加载到JVM中并转换为可执行的Java类。它是实现Java程序动态加载的关键,能够根据需要在运行时加载类。

Class Loader的主要作用如下:

  • 动态加载类:Class Loader能够在运行时根据需要加载类,便于程序的扩展和灵活性。
  • 隔离不同的类:不同的Class Loader加载的类之间相互隔离,避免类冲突,实现类的版本控制。
  • 保护核心类库:核心类库由Bootstrap Class Loader加载,保证了核心类的安全性。

2. Class Loader的工作原理

Java的类加载过程可以分为以下几个步骤:

  1. 加载:通过类的全限定名查找并读取对应的字节码文件,将字节码文件转换为Class对象。
  2. 连接:将类的二进制数据合并到JVM的运行时数据区域中,并进行校验、准备和解析等操作。
  3. 初始化:对类的静态字段进行初始化,执行类的静态代码块。
public class MyClass {
    private static int count = 0;
    
    static {
        count = 10;
        System.out.println("Static block executed.");
    }
    
    public MyClass() {
        System.out.println("Constructor executed.");
    }
    
    public static void main(String[] args) {
        MyClass myObject = new MyClass();
    }
}

上述代码中,静态代码块会在类初始化时执行,构造方法会在创建对象时执行。通过类加载器加载MyClass类时,会先执行静态代码块,输出"Static block executed.",然后执行构造方法,输出"Constructor executed."。

3. Class Loader的层次结构

Java的Class Loader采用了类似父子继承的层次结构,主要包含以下几种ClassLoader:

  • Bootstrap Class Loader:由C++实现,负责加载核心类库,如java.lang包中的类。
  • Extension Class Loader:负责加载Java的扩展类,位于$JAVA_HOME/jre/lib/ext目录下。
  • System Class Loader:也称为应用程序类加载器,负责加载应用程序的类。
  • 自定义 Class Loader:开发者可以根据需要自定义ClassLoader,继承自ClassLoader类。

ClassLoader采用双亲委派模型,即在加载类时先委托父ClassLoader尝试加载,只有父ClassLoader找不到对应的类时,才由自己加载。