一、类加载器分类
java的类加载器有三种:启动类加载器(bootstrap class loader)、扩展类加载器(extension class loader)、应用类加载器(application class loader)。
启动类加载器:c++实现的,没有对应的java对象。加载最基础最重要的类,比如JRE的lib目录下的jar包类
扩展类加载器:java.lang.ClassLoader的子类。加载次要的类,比如lib/ext目录下的jar包类
应用类加载器:java.lang.ClassLoader的子类。加载应用程序路径下的类,一般我们自己写的类就是应用类加载器加载的。
类加载后会生成一个Class类的实例,这个实例不是类对象实例,不要搞混淆,大概过程可参看如下流程图:

二、类加载的方法
1、Class.forName(String className)
调用该方法加载指定类,会执行类的静态代码
2、类名.class
这种方法加载指定类,不会执行静态方法
3、ClassLoader.loadClass(String name)
这种方法加载指定类,不会执行静态方法
三、类加载的过程
1、加载
查找字节流,据此来创建类的过程。对于数组类来说,没有对应的字节流,由java虚拟机直接生成,其他类则由类加载器完成加载。
2、链接
链接由验证、准备、解析三个过程。
3、初始化
直接赋值的静态字段被final修饰,且类型是基本类型或字符串的时候,会被编译器标记为常量值。
其他的直接赋值操作,以及静态代码块中的代码,都被置于同一个方法中,并命名为<clinit>
初始化就是为标记为常量值的字段赋值,以及执行<clinit>方法的过程。